【问题标题】:Insert html tags to mixed string with php用php将html标签插入到混合字符串中
【发布时间】:2016-01-01 21:03:24
【问题描述】:

我有一个包含混合文本和 html 标记(例如锚点、下划线)的字符串,例如:

$string = 'text1<a href="">text2</a> text3';

我想用 span 标签包装 text1、text2 和 text3。

这需要精确地完成,这样原始的 html 标记才不会停止。 IE。最终结果应该是:

$new_string = '<span>text1</span><a href=""><span>text2</span></a><span>text3</span>';

任何想法如何做到这一点?

【问题讨论】:

  • $new_string = '&lt;span&gt;text1&lt;/span&gt;&lt;a href=""&gt;&lt;span&gt;text2&lt;/span&gt;&lt;/a&gt;&lt;span&gt;'.$string.'&lt;/span&gt;';
  • 您想动态添加标签吗?用 JavaScript 吗?
  • 那么像'&lt;div data-text1="text2"&gt;text3&lt;/div&gt;'这样的字符串呢?
  • 不,不需要是动态的。它是来自数据库的字符串,所有字符串操作都是用 PHP 完成的。
  • 我正在寻找一种可以将文本与任何标记隔离的解决方案,可能使用“”作为分隔符并将 包裹在每个孤立的文本周围

标签: javascript php html regex dom


【解决方案1】:

刚刚找到了一行解决方案:

JS:

function addSpans($string){
  str.replace(/[^<>]+(?=<[^<>]+>)|[^<>]+$/g, (text) => {return "<span>"+text+"</span>";})
}

PHP:

function addSpans($input){
  return preg_replace("/[^<>]+(?=<[^<>]+>)|[^<>]+$/","<span>$0</span>",$input);
}

它是如何工作的: [^&lt;&gt;]+(?=&lt;[^&lt;&gt;]+&gt;)|[^&lt;&gt;]+$ 匹配任何匹配 [^&lt;&gt;]+(?=&lt;[^&lt;&gt;]+&gt;) 或匹配 [^&lt;&gt;]+$ 的字符串

[^&lt;&gt;]+(?=&lt;[^&lt;&gt;]+&gt;): 任何字符串后跟一个 html 标签

[^&lt;&gt;]+ 匹配一个或多个不是

的字符

(?=&lt;[^&lt;&gt;]+&gt;) 匹配 后跟 >。这匹配任何 html 标签

[^&lt;&gt;]+$: 输入末尾没有html标签的任何字符串

[^&lt;&gt;]+$[^&lt;&gt;]+ 相同,但在输入的末尾


要在 JS 中添加 span 标签,您必须传递一个函数,该函数将匹配的字符串作为输入,作为替换。

在 PHP 中,您可以使用 $0-99 在替换中引用匹配的字符串,其中 $0 是匹配整个模式的字符串。


找不到使用正则表达式的单行方法,但此功能应该可以工作。

JS代码:

function addSpans($string){
  text = $string.split(/<[^>]+>/g);
  tags = $string.match(/<[^>]+>/g);
  retvar = "";
  for(i = 0; i < text.length;i++){
    if(typeof text[i] !== 'undefined' && text[i].length > 0){
      retvar += "<span>"+text[i]+"</span>";
    }
    if(typeof tags[i] !== 'undefined'){
      retvar += tags[i];
    }    
  }
  return retvar;
}

PHP 代码:

function addSpans($input){

  $text = preg_split('/<[^>]+>/',$input);
  $tags = array();
  preg_match_all('/<[^>]+>/',$input,$tags);
  $retvar = "";
  for($i = 0; $i < count($text);$i++){      
    if(isset($text[$i]) && strlen($text[$i]) > 0){
      $retvar .= "<span>".$text[$i]."</span>";
    }
    if(isset($tags[0][$i])){
      $retvar .= $tags[0][$i];
    }    
  }
  return $retvar;
}

代码是这样工作的:

1.: 用 HTML 标签分割字符串

正则表达式的工作原理:

&lt; 匹配字符

[^&gt;]+ 匹配一个或多个不是 >(关闭 html 标记)的字符

&gt; 匹配字符 >(关闭 html 标记)

2.: 获取 HTML 标签。相同的正则表达式,但现在用于匹配而不是拆分

3.: 在循环中:

3.1:如果当前文本不为空,则用 span 标签包围当前文本(就像输入以标签开始/结束一样)

3.2:再次添加用于分割的HTML标签。

3.3:重复下一个文本和下一个 html 标记。

4.: 最终返回组合字符串。

我还会检查两个代码中是否存在当前文本/标签,以防它们的长度不同。

【讨论】:

  • 通过您的示例,它会在我测试时提供您想要的输出。在哪种情况下它不适合你?
  • 你的意思是用php还是js写?看起来像一个混合体。
  • 对不起,我不知道如何实现它。当我将它粘贴到我的 php 脚本中时,出现了很多错误
  • 那是javascript代码。也许我也可以在 php 中找到一种方法。
  • 你是对的。它确实在js中工作。非常感谢您的帮助!这是极好的。您介意多解释一下代码的工作原理,尤其是正则表达式吗?
猜你喜欢
  • 2014-10-29
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 2021-09-29
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多