如何使用php在字符串中标记分号(;),该字符串不是HTML实体的结束字符


How to use php to mark up the semicolon(;) in a string which isn't the end character of the HTML entity?

如何使用PHP在字符串中标记分号(;)
但是不要标记HTML实体的结束字符

例如:

$string="ab;c&ssdd;;kd&d"ddsskcl;ddfvv";

输出:ab<font color=red><b>;</b></font>c&amp;ssdd<font color=red><b>;</b></font><font color=red><b>;</b></font>kd&d&quot;ddsskcl<font color=red><b>;</b></font>ddfvv

最干净的方法是首先使用htmlspecialchars_decode(),然后将字符串分解成部分,并使用htmlspecialchars()重新编码新标签中的文本部分。听起来你的标记格式不是很好,如果你试图在HTML/XML上使用正则表达式,你很容易陷入混乱。

通常,您希望将文本作为文本处理,而不是将HTML作为文本或将文本作为HTML处理。这就是为什么我建议在尝试对其进行任何处理之前将HTML转换为文本。

我会使用负向后看的正则表达式(确保之前的正则表达式不能匹配,这里;使用not &map not <not >(htmlsplecialcharars))您可以在这里使用以下简单的正则表达式

$string="ab;c&amp;ssdd;;kd&d&quot;ddsskcl;ddfvv";
echo preg_replace("/(?<!&amp|&quot|&quote|&lt|&gt);/","<font color=red><b>;</b></font>",$string)."'n";

缺点:你必须对所有的更改进行后视镜。

好消息:您可以调用get_html_translation_table来构建这样的模式:
$string="ab;c&amp;ssdd;;kd&d&quot;ddsskcl;ddfvv";
$entities = get_html_translation_table(HTML_ENTITIES); # Get the html entities table
$pat="(?<!"; # Start of the pattern
foreach($entities as $key => $val) {  # Iterate over the html entities
 $pat .= rtrim($val,";")."|"; # concatenate to pattern as an ORED expression
};
$pat=rtrim($pat,"|").");"; # finish the pattern
echo preg_replace("/$pat/","<font color=red><b>;</b></font>",$string)."'n"; # replace where needed
输出:

> php ./replace.php
ab<font color=red><b>;</b></font>c&amp;ssdd<font color=red><b>;</b></font><font color=red><b>;</b></font>kd&d&quot;ddsskcl<font color=red><b>;</b></font>ddfvv