Regexp不支持段落标记

时间:2012-06-24 15:50:21

标签: regex pcre

我正在尝试修复一些HTML,它工作得很完美。但有一点让我烦恼;特别是打开和关闭<p></p>标签。 我需要解决两个案例: a)删除<p> </p>序列。 b)删除结尾并开始空白段IN段落。 我这样做:

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

3 个答案:

答案 0 :(得分:1)

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

使用单引号可获得更清晰的反斜杠。你是说\ s还是\\ s?幸运的是,在这种情况下没关系。

以上PCRE将删除&lt; p&gt; &LT; / p为H.只有在它们之间有空格(或没有)的标签,在&lt; p&gt;之后的空格和&lt; / p&gt;之前的空格。我不明白为什么你的原始代码不起作用。你应该在任何&lt; p&gt;之前或之后移除一个空格。或&lt; / p&gt;标记(即" </p> "将成为"</p>"

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

答案 1 :(得分: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';

答案 2 :(得分:0)

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

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

但你可能不应该使用正则表达式来解析html,因为很多时候会在stackoverflow上提及。

编辑:

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