如何使用PHP在字符串中标记分号(;)
但是不要标记HTML实体的结束字符
$string="ab;c&ssdd;;kd&d"ddsskcl;ddfvv";
输出:ab<font color=red><b>;</b></font>c&ssdd<font color=red><b>;</b></font><font color=red><b>;</b></font>kd&d"ddsskcl<font color=red><b>;</b></font>ddfvv
最干净的方法是首先使用htmlspecialchars_decode(),然后将字符串分解成部分,并使用htmlspecialchars()重新编码新标签中的文本部分。听起来你的标记格式不是很好,如果你试图在HTML/XML上使用正则表达式,你很容易陷入混乱。
通常,您希望将文本作为文本处理,而不是将HTML作为文本或将文本作为HTML处理。这就是为什么我建议在尝试对其进行任何处理之前将HTML转换为文本。
我会使用负向后看的正则表达式(确保之前的正则表达式不能匹配,这里;使用not &map not <not >(htmlsplecialcharars))您可以在这里使用以下简单的正则表达式
$string="ab;c&ssdd;;kd&d"ddsskcl;ddfvv";
echo preg_replace("/(?<!&|"|"e|<|>);/","<font color=red><b>;</b></font>",$string)."'n";
缺点:你必须对所有的更改进行后视镜。
好消息:您可以调用get_html_translation_table来构建这样的模式:$string="ab;c&ssdd;;kd&d"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&ssdd<font color=red><b>;</b></font><font color=red><b>;</b></font>kd&d"ddsskcl<font color=red><b>;</b></font>ddfvv