匹配特殊类型的空白

时间:2013-11-20 13:16:22

标签: php regex

我从TinyMCE的大量编辑和后处理输入中保存了一个类似的字符串(这是一个空段落)。

这就是echo之后的样子,在浏览器的HTML源代码中:

<p> </p>

现在,我需要删除那些空段落。

我已经尝试了

$output = str_ireplace("<p> </p>", "", $string);
$output = preg_replace("/<p> <\/p>/", "", $string);
$output = preg_replace("/<p>[ \t\n\r]*<\/p>/", "", $string);
$output = preg_replace("/<p>[\s]*<\/p>/", "", $string);

以及更多没有运气的变种。它仍然存在,完好无损。我也尝试过mb_ereg_replace并匹配&nbsp;,这显然不是这样。

另一方面,这有效:

$output = preg_replace("/<p>.*<\/p>/", "", $string);

但当然也会删除带有实际内容的段落。

那个“类似太空”的角色还能做什么呢?我该如何匹配?

解决 感谢Ibizaman和这个帖子link,我找到了这个角色。它是unicode值。见http://unicodelookup.com/#160/1

这有效:

$output = preg_replace("/<p>[\x{00A0}\s]*<\/p>/u", "", $string);

正如mcrumley所指出的,这可能会更好:

"/<p>[\p{Zs}\s]*<\/p>/iu"

3 个答案:

答案 0 :(得分:3)

您可以使用Unicode字符属性来匹配所有空格。 \p{Zs}是“空格分隔符”,包括空格,不间断空格,精简空间等。您还可以使用\pZ匹配所有分隔符,包括行分隔符和段落分隔符。有关详细信息,请参阅http://www.php.net/manual/en/regexp.reference.unicode.php

$output = preg_replace("/<p>[\p{Zs}\s]*<\/p>/iu", "", $string);

答案 1 :(得分:2)

由于您不知道输出了哪个字符,因此首先使用输出unicode值的函数解析$string的输出(请参阅this SO问题)。

或者,您可以采取相反的方式,只接受格式良好的段落:

$output = preg_replace("/(<p>[^a-zA-Z0-9]*<\/p>)/", "\1", $string);

免责声明:我已经在评论中提出这个问题,但由于它解决了问题,因此最好将答案放在未来参考中,我认为

答案 2 :(得分:0)

'类似空格的字符'是\s,这将使您的整行

$output = preg_replace("/<p>\s*<\/p>/", "", $string);

请参阅regex101.com上的an example