-3

我正在尝试修复一些 HTML,它运行良好。但有一件事是给我带来麻烦;特别是打开和关闭<p></p>标签。我需要解决两种情况:a)删除<p> </p>序列。b) 删除段落中的结束和开始空格。我正在这样做:

preg_replace("#<p>\s*</p>#","",$str);
preg_replace("#\s?(</?p>)\s?#", '$1', $str);

但两者都没有取代任何东西。我做错了什么,不完全正确?

编辑:原始代码

$source=preg_replace("#\s?(</?p>)\s?#", '$1', $source); //Replace possible innecessary blank spaces
return preg_replace("#<p>\s*</p>#","",$source); //Delete all posible empty pharagraphs

谢谢 :D

4

3 回答 3

1
$source = preg_replace('#<p>\s*</p>|(?<=<p>)\s+|\s+(?=</p>)#', '', $source);

使用单引号以获得更清晰的反斜杠。你的意思是 \s 还是 \\s?幸运的是,在这种情况下,这并不重要。

上面的 PCRE 将删除 <p> </p> 标签之间只有空格(或没有空格),<p> 之后的空格和 </p> 之前的空格。不过,我不明白为什么您的原始代码不起作用。您应该在任何 <p> 或 </p> 标记之前或之后删除一个空格(即" </p> "会变成"</p>".

如果您仍然遇到问题,则需要发布更多代码。您是否正确传递了变量等?尝试为您的问题编写一个最小案例并发布整个程序。

于 2012-06-27T05:50:56.123 回答
0

第二个正则表达式将不起作用,因为</p>不再存在,您需要先运行它。为什么你需要正则表达式来删除空格,你可以使用修剪

$str = trim(preg_replace("#<p>(.*)</p>#Us", "$1", $str));

但是您可能不应该使用正则表达式来解析 html,因为 stackoverflow 上提到了很多次。

编辑:

preg_replace("/\s*<\/?p>\s*/", "", $str);
于 2012-06-24T15:58:52.960 回答
0

您需要将其分配回$str

$str = preg_replace ($pattern, $replacement, $str);

确保您没有处理一些特殊类型的空白。如果是这样,则使用复杂模式:

$pattern = '/<p>(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*<\/p>/iu';

要删除段落中的开始和结束空格,请使用模式:

$pattern = '/(?<=<p>)(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*/iu';
$pattern = '/(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*(?=<\/p>)/iu';
于 2012-06-24T15:56:40.300 回答