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