使用 preg_replace 替换空段落时,无法识别空格。

5

我需要更改这个:

<p> </p>

转换成这样:

<p class="notmobile"> </p>

在一个字符串中。看起来很简单,但以下操作是无效的:

$filecontent  = preg_replace('/<p> <\/p>/', '<p class="notmobile"> </p>',   $filecontent);
$filecontent  = preg_replace('/^<p> <\/p>/', '<p class="notmobile"> </p>',  $filecontent);
$filecontent  = preg_replace('/<p>\s<\/p>/', '<p class="notmobile"> </p>',  $filecontent);
$filecontent  = preg_replace('/<p>\s+<\/p>/', '<p class="notmobile"> </p>', $filecontent);
$filecontent  = str_replace('<p> </p>', '<p class="notmobile"> </p>',   $filecontent);

为了确保我没有疯掉,我对xxx进行了替换,将其变成了yyy,这样就没问题了。我认为问题在于我的空格不是普通的空格,因为内容可能是Windows字符集iso-8859-1之类的(或者因为我们在某个地方将其转换为utf-8时出现了混淆..)。
从Chrome/Firefox复制并粘贴空段落也不起作用。
我有点卡住了:( 感谢您的帮助!
更新:这里是base64_output,AwMD是一串0,我用它来标记上面一串p的开头。
*更新2:我发现在PHP中,字符ord值为194,后面跟着160——例如,它是两个字符。奇怪。*

你能否以一些明确的格式,如十六进制或base64编码的方式发布字符串,以便我们可以准确地看到它包含哪些字符? - Mark Byers
我该怎么做呢?这段文字是由Tinymce插入到我们的CMS中的,CMS将内容保存到MySQL数据库中,然后CMS从数据库中显示页面。 - John Hunt
你需要的是第四个 preg_replace。更重要的是:它正常工作。你可以将 + 改为 * 并添加 /ims 标志。否则,你的源文本中可能有其他内容。(例如 <p> 标签中的现有属性?) - mario
为了测试你的理论,你可以使用ord()打印空段落的每个字符。或者你的编辑器可能支持打印字符的十六进制值,例如在Vim中,将鼠标指向字母上并输入ga - Mikel
如果是其他的空格字符,那么请使用 /\p{Z}+/u 进行替换。 - mario
4个回答

8

确实是 NBSP 的 UTF-8 编码 11000010 10100000。 如前所述,代码有效:

= preg_replace('/<p>\p{Z}*<\/p>/u', '<p class="notmobile"> </p>', $f);

谢谢Mario, 我一直没弄清楚怎么正确地使用你的正则表达式。已接受答案! - John Hunt

1

这可能是一个不间断空格,ASCII代码为&nbsp; 0xA0, 160

尝试:

$filecontent  = preg_replace('/<p>\xA0<\/p>/', '<p class="notmobile"> </p>',   $filecontent);

你一直朝着正确的方向前进。有趣的是,C2A0被显示为一个字符...我想知道C2实际上是什么... - John Hunt

1
为什么不直接用 <p class="notmobile"> 替换 <p> 呢?
$filecontent = str_replace("<p>", "<p class=\"notmobile\">", $filecontent);

或者你是想要替换所有<p>标签,无论内容如何,都用<p class="notmobile"> </p>来代替吗?


对于标签对之间只有一个空格的情况,请尝试进行如下替换:

$filecontent = str_replace("<p> </p>", "<p class=\"notmobile\"> </p>", $filecontent);

因为我只想用它替换由tinymce生成的空段落,而不是带有内容的段落。 - John Hunt
然后只需将 <p> </p> 替换为 <p class="notmobile"> </p> - Blender
重点是空格不是普通的空格,而是十六进制的C2A0(例如两个奇怪的字符粘在一起)。 - John Hunt

0
$filecontent  = preg_replace('/<p>\xC2\xA0<\/p>/', '<p class="notmobile"> </p>',    $filecontent);

当你意识到事情并不像看起来那样简单时,一切都变得容易了!现在可以修改有用的答案。


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