Php 使用preg_replace替换空段落,无法识别空白

Php 使用preg_replace替换空段落,无法识别空白,php,regex,encoding,Php,Regex,Encoding,我需要改变这一点: <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  = 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);
$filecontent=preg_replace(“//”,“

”,$filecontent); $filecontent=preg_replace(“/^/”,“

”,$filecontent); $filecontent=preg_replace(“/\s/”,“

”,$filecontent); $filecontent=preg_replace(“/\s+/”,“

”,$filecontent); $filecontent=str_replace(“

”,“

”,$filecontent);
为了确保我没有发疯,我在xxx上做了一个替换,将其转换为yyy,工作正常。我想问题是我的空间不是一个普通的空间,因为内容可能是windows字符集iso-8859-1或其他任何东西(或者它被弄糊涂了,因为我们已经将其转换为utf-8)

从chome/firefox复制和粘贴空段落也不起作用

我有点困了:(谢谢你的帮助

更新:这是base64_输出,AwMD是一个0字符串,我用它来标记p字符串的开头,如上所述。

AWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDA8L3A+DQo8cD7CoDwvcD4NCjxwPsKgPC9wPg0KPHA+wqA8L3A+DQO8CD7CODWVCD4NCXWPSKGPC9WPG0KPHA+wqA8L3A+DQo8cD7CoDwvcD4NCjxwPsKgPC9wPg0KPHA+wqA8L3A+DQO8CD7COD7CODWVCD4NCJXWPSKGPC9WPG0KPHA+WQO8WPC9WPC9WPK9KPHA+WQO8CD8WPC9WPC9WPK9WPK9YMCK9WPC9WQO8GPC9KPHA+WQO8GPC9WPK9WPK9WPKKKKKK9YMPC9WPKKKKK9WP


*更新2:我发现php中的字符ord值是:194后跟160-例如它是两个字符。奇怪。*

为什么不用

替换

$filecontent=str\u replace(“”,“

”,$filecontent);

或者,您是否正在尝试用

替换所有成对的
标记(无论内容如何)


对于中间只有一个空格的标记对,请尝试这样替换:

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

”,“

”,$filecontent);
它可能是一个不间断的空格
ASCII码
0xA0,160

尝试:

$filecontent=preg_replace(“/\xA0/”,“

”,$filecontent);
$filecontent=preg_replace(“/\xC2\xA0/”,“

”,$filecontent);

当你意识到一切都不像看上去那么简单时,就很容易了!现在就修改有用的答案。

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

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

',$f);
你能用一些明确的格式(如十六进制或base64)发布编码的字符串,以便我们能准确地看到它由哪些字符组成吗?我该怎么做?段落由tinymce插入我们的cms中,cms将内容保存到mysql数据库中,然后cms显示数据库中的页面。你的第四个preg_替换是什么你想要。更重要的是:它工作正常。你可以将
+
更改为
*
,并添加
/ims
标志。否则,源文本中还有其他内容。(例如
标记中的现有属性?)为了测试你的理论,你可以使用
ord()打印空段落的每个字符
。或者您的编辑器可能支持打印字符的十六进制值,例如,在
Vim
中,将鼠标悬停在字母上并键入
ga
。如果是其他空白字符,则使用
/\p{Z}+/u
杀死它。因为我只想用它来替换tinymce生成的空段落,而不是用内容来替换段落。然后用

来替换

。重点是这个空间不是一个规则的空间,它是十六进制C2A0(例如两个有趣的字符粘在一起)你正朝着正确的方向前进。有趣的是,C2A0仅显示为一个字符。我想知道C2实际上是什么。谢谢Mario,我不知道如何正确地将你的regexp放入其中。答案已接受!
$filecontent  = preg_replace('/<p>\xA0<\/p>/', '<p class="notmobile"> </p>',   $filecontent);
$filecontent  = preg_replace('/<p>\xC2\xA0<\/p>/', '<p class="notmobile"> </p>',    $filecontent);
= preg_replace('/<p>\p{Z}*<\/p>/u', '<p class="notmobile"> </p>', $f);