我正在比较字符串和显示差异。这些文本字符串可能包含标记。有问题的情况是两个标签没有用空格分隔,例如:
<p>Some random text</p>
与<p><strong>Some random</strong> text</p>
进行比较。在这种情况下,diff算法认为第1个差异是<p>Some
和<p><strong>Some
并且为了显示它,它会做这样的事情:
<del><p><Some></del><ins><p><strong>Some</ins> <del>random</del> <ins>random</strong></ins> text</p>
(del - 删除,ins - 插入)
我打赌你看到我要去的地方 - 它重复了<p>
,而有一个</p>
。
要解决此问题,我必须确保每个<p>
之后和每个</p>
之前有一个空格,因此它不会将其视为差异(我只需要{{1标签)。但是只有在没有空格键的情况下才能添加空格,因为这个文本字符串可能会被更新,所以如果我每次更新这个字符串时都会添加一个空格,那么它会累积而且很糟糕。
TL;博士;知道如何检查p
之后和<p>
之前是否有空格,如果没有,请添加一个空格。并对</p>
?
答案 0 :(得分:2)
(<del><p>
不是有效标记,因为<del>
是内联元素,但<p>
是块级元素,内联元素不能包含块级元素。)
使用支持XML的差异算法而不是当前对空格敏感的纯文本差异,可以更好地解决您的基本问题。但是我对快速修复的需求很敏感,所以这看起来像是正则表达式的合适用例。
(在“不要使用带有HTML的正则表达式”之前,人群会说:虽然正则表达式确实不能用于智能地解析HTML,但你仍然可以适当地使用它来执行不依赖的简单文本处理操作。改变文档的语义结构。)
$text = "<p> hasSpace </p>\r\n<p>noSpace</p>";
$text = preg_replace( "/<p>([\S])/" , "<p> ${1}" , $text ); // Ensure all <p> has trailing space
$text = preg_replace( "/([\S])</p>/", "${1} </p>", $text ); // Ensure all </p> has leading space
echo "<pre>$text</pre>";
这给出了这个输出:
<p> hasSpace </p>
<p> noSpace </p>
答案 1 :(得分:1)
如果您只需要替换<p>
和</p>
的强力替代品,这将为您完成:
$string=str_replace(array("<p>","</p>"),array("<p> "," </p>"),$string);
$string ="<p><strong>Some random</strong> text</p>";
echo $string;
echo "\n";
$string=str_replace(array("<p>","</p>"),array("<p> "," </p>"),$string);
echo $string;
哪个输出:
<p><strong>Some random</strong> text</p>
<p> <strong>Some random</strong> text </p>