【问题标题】:Replacing empty paragraph using preg_replace, whitespace not recognized使用 preg_replace 替换空白段落,无法识别空格
【发布时间】:2011-03-17 22:29:22
【问题描述】:

我需要改变这个:

<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 沿线某处..)

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

我有点卡住了 :( 感谢您的帮助!

更新:这是 base64_output,AwMD 是一串 0,我用它来标记上面一串 p 的开头。

AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA8L3A + DQo8cD7CoDwvcD4NCjxwPsKgPC9wPg0KPHA + wqA8L3A + DQo8cD7CoDwvcD4NCjxwPsKgPC9wPg0KPHA + wqA8L3A + DQo8cD7CoDwvcD4NCjxwPsKgPC9wPg0KPHA + wqA8L3A + DQo8cD7CoDwvcD4NCjxwPsKgPC9wPg0KPHA + wqA8L3A + DQo8cD7CoDwvcD4NCjxwPsKgPC9wPg0KPHA + YmFzZTY0ZW5jb2Rpbmc8L3A + PC9w P>

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

【问题讨论】:

  • 您能否发布以某种明确格式(例如 hex 或 base64)编码的字符串,以便我们可以准确地看到它由哪些字符组成?
  • 我该怎么做?该段落由tinymce插入到我们的cms中,cms将内容保存到mysql数据库中,然后cms显示数据库中的页面。
  • 你的第四个 preg_replace 就是你想要的。更重要的是:它运行良好。您可以将 + 更改为 * 并添加 /ims 标志。否则,您的源文本中还有其他内容。 (例如&lt;p&gt; 标签中的现有属性?)
  • 为了检验您的理论,您可以使用ord() 打印空段落的每个字符。或者您的编辑器可能支持打印字符的十六进制值,例如在Vim 中,将鼠标悬停在字母上并输入ga
  • 如果是其他空白字符,则使用/\p{Z}+/u 将其杀死。

标签: php regex encoding


【解决方案1】:

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

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

【讨论】:

  • 谢谢马里奥,我不知道如何正确地输入你的正则表达式。已接受答案!
【解决方案2】:

它可能是一个不间断的空格&amp;nbsp;ASCII 码0xA0, 160

试试:

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

【讨论】:

  • 你正朝着正确的方向前进。有趣的是,C2A0 只显示为一个字符。我想知道 C2 到底是什么。
【解决方案3】:

为什么不直接将&lt;p&gt; 替换为&lt;p class="notmobile"&gt;

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

或者您是否尝试用&lt;p class="notmobile"&gt; &lt;/p&gt; 替换所有&lt;p&gt; 标记(无论内容如何)?


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

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

【讨论】:

  • 因为我只想用它替换由tinymce生成的空段落,而不是带有内容的段落。
  • 然后将&lt;p&gt; &lt;/p&gt; 替换为&lt;p class="notmobile"&gt; &lt;/p&gt;
  • 重点是空格不是常规空格,而是十六进制 C2A0(例如两个有趣的字符粘在一起)
【解决方案4】:
$filecontent  = preg_replace('/<p>\xC2\xA0<\/p>/', '<p class="notmobile"> </p>',    $filecontent);

当您意识到一切都不像看起来那样时,这很容易!立即修改有用的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多