PHP - 正则表达式停止在“”

时间:2012-06-22 00:26:15

标签: regex

我正在使用正则表达式将HTML转换为BBCODE。但是,代码来自农民WYSIWYG编辑(TinyMce)我遇到了问题。这是一个非常奇怪的案例:

有一些典型的空白阶段图<p>&nbsp;</p>,但我无法以任何方式匹配它们。下面的正则表达式中没有一个正在发挥作用:

str_replace("<p>&nbsp;</p>",........)
str_replace("<p> </p>".........)
preg_replace("#<p>.?</p>#"....)

这可行,但如果“空格”在其他地方,我怎么能匹配呢?

preg_replace("#<p>.{1,6}</p>#"....)

即使没有写入&nbsp;,我怎样才能使它匹配所有&nbsp;(在BD中,存储原始字符串,<p> </p>未写入,只有{{ {1}}块)这很奇怪......

2 个答案:

答案 0 :(得分:4)

我建议您阅读 Unicode Regular Expressions Wikipedia: Unicode Whitespace character

脚本:

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

输出:

123abc

注意:要匹配任何单个unicode字形使用模式\P{M}\p{M}*+

答案 1 :(得分:1)

使用此正则表达式时,我遇到了类似的问题( PHP进程停止):

([\r\n\t ]|\xC2\xA0|&nbsp;)+

匹配空格(我的目的:用单' ' 替换任何类型的空格)。我测试的字符串包含丰富的HTML标记。

这是我的解决方案:

$text = str_replace( array( '\xC2\xA0', '&nbsp;' ), ' ', $text ); $text = preg_replace( "/[\n\r\t ]+/", ' ', $text );

希望它有所帮助。