如何添加并确保每个<p>之后和之前有一个空格</p>

时间:2015-06-17 23:54:43

标签: php laravel-5

我正在比较字符串和显示差异。这些文本字符串可能包含标记。有问题的情况是两个标签没有用空格分隔,例如:

<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>

中的所有代码执行此过程

2 个答案:

答案 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);

Heres some example code

$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>
相关问题