匹配特殊种类的空白符

5

我有一个类似于这样的字符串(它是一个空段落),保存在我从TinyMCE输入进行重编辑和后处理后的内容中。

在浏览器的HTML源代码中echo出来的样子如下:

<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和这个线程链接,我找到了这个字符。 它是unicode值中的nbsp。请参见http://unicodelookup.com/#160/1

这样做有效:

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

正如mcrumley所指出的,这种方法可能会更好:
"/<p>[\p{Zs}\s]*<\/p>/iu"

关于 <p>[^<]*<\/p> 怎么样?无论如何,检查页面源代码以确保...我记得上次类似的情况让我发疯:S - Enissay
@ibizaman:“/<p>[^a-zA-Z0-9]*</p>/”是个好主意,它作为一个不错的解决方法,但我可能需要稍微改进一下,谢谢。至少有了点头绪。 - Saix
2
@Saix 是的,确实如此。这就是我说它太严格的原因。尝试使用输出Unicode值的函数解析字符串(参见 SO问题)。然后你会看到实际发生了什么。 - ibizaman
3
@ibizaman:我找到那个混蛋了... [链接] (http://unicodelookup.com/#160/1) - Saix
2
你的字符类并没有完全按照你想象中的那样工作。[\x{00a0}|\s]匹配非断行空格、空格和管道符"|". 你可以去掉"|"。 - mcrumley
显示剩余6条评论
3个回答

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

2

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

或者,您可以反过来进行处理,仅接受格式良好的段落:

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

免责声明:虽然我已经在评论中提到了这个问题,但考虑到它解决了问题,为了未来的参考,我认为将其放在回答中会更好。


注:此段文字涉及个人观点和评论,如需正式文档请联系相关专业人士。

0
一个“空格字符”是\s,这将使您的整行。
$output = preg_replace("/<p>\s*<\/p>/", "", $string);

在regex101.com上查看一个示例


1
他已经尝试过 <p>[\s]*<\/p>,在这种情况下你不需要转义反斜杠。 - HamZa
只是为了确保,我也尝试了这个。也不起作用。 - Saix
好的,它确实有效。我会更新我的答案,并附上到regex101.com的链接。 - SQB
@SQB 当然,它对于“普通空格”有效,但是OP肯定没有普通空格0x20,或者代码(逻辑)存在其他问题。 - HamZa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接