【问题标题】:Using regex to remove empty paragraph tags <p> </p> (standard str_replace on "space" not working)使用正则表达式删除空段落标签 <p> </p> (“空格”上的标准 str_replace 不起作用)
【发布时间】:2012-07-20 02:53:10
【问题描述】:

当您按两次 Enter 时,TinyMCE 会创建空段落标签。喜欢:

<p> </p>

这是 &lt;p&gt;SPACE&lt;/p&gt;

在 FireBug 中,它将此空间称为 "&amp;nbsp;",但 html 代码/数据库后端仅显示一个空间。当我做"str_replace('&lt;p&gt; &lt;/p&gt;'....." 时,它没有找到块......基本上我认为“空间”在某种程度上不是标准空间和某种无聊的编码空间。有没有我可以运行的正则表达式来删除这个标签?我已经坚持了好几个小时......甚至像

regex('&lt;p&gt;LESS THAN THREE CHARS&lt;/p&gt;'...)

可能会工作

谢谢

【问题讨论】:

  • regex('&lt;p&gt;.&lt;/p&gt;'...) 句号可能对这个角色有用吗?
  • 不间断空格确实有不同的代码点。你能遍历字符串并检查打印字符的等效数字吗?
  • 好的,当我执行 utf8_encode(

    ) 我得到

    Â

    ...原来数据库是 ISO,但现在已更改为UTF8 编码...那么现在我该如何摆脱这些垃圾数据?

标签: php regex tinymce


【解决方案1】:

我会使用:

$str = preg_replace('~<p>\s*<\/p>~i','',$str);

其中\s 表示任何类型的空白(制表符、空格等),* 表示此(空格)出现 0 次或多次。所以&lt;p&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;{multiple spaces here}&lt;/p&gt;都将被一个空字符串替换。额外的i 标志用于不区分大小写,以防&lt;p&gt; 可能改为&lt;P&gt;

【讨论】:

  • 没有骰子...警告:preg_replace() [function.preg-replace]:未知修饰符'g'
  • @inhan 没有 g 标志,仅用于 str_replace()。 preg_replace 自动替换输入中的所有内容。乍得,删除 g 标志,它应该可以工作。
  • 抱歉混淆了 Javascript 和 PHP 标志 :) 编辑我的帖子。谢谢@TurdPile
【解决方案2】:
$text = preg_replace('#<p>&nbsp;</p>#i','<p></p>', $text);

对我有用,因为变量包含实际字符串 "&amp;nbsp;" 而不是不间断空格 unicode 字符。因此,#&lt;p&gt;.&lt;/p&gt;#i 既不能工作,也不能从字符映射中复制不间断空格字符。

【讨论】:

    【解决方案3】:

    如果&lt;p&gt; 标签有任何内联属性,上述答案将不起作用,例如 &lt;p style="font-weight:bold"&gt;.

    这里有一个正则表达式来捕捉它:

    #<p[^>]*>(\s|&nbsp;|</?\s?br\s?/?>)*</?p>#
    

    【讨论】:

      【解决方案4】:

      给定的答案都不适合我,但以下是有效的:

      $str = str_replace('&lt;p&gt;&nbsp;&lt;/p&gt;', '', $str);
      

      绝对不是最正确的做事方式。但是,如果您使用(反对)TinyMCE,特别是在 SuiteCRM 内部,这应该会有所帮助。

      【讨论】:

        【解决方案5】:

        试试这个

        $string="a bunch of text with <p> </p> in it";
        
        $string=str_replace("/<p> <\/p>/","",$string);
        

        注意几点:要匹配的字符串前后的正斜杠,以及第二个段落标记中正斜杠之前的转义反斜杠。

        【讨论】:

        • 这是一个糟糕的例子。使用带有 preg_replace 的正则表达式是可行的方法。
        • @TurdPile 我没有说这是一个很好的例子,但 OP 的问题是关于正则表达式方法,而不是 str_replace 的优点。我个人也使用 preg_replace。
        • 问题是你错过了两个可以让它工作的大特性,一个是你应该使用 \s+ 而不是空格,其次,你应该使用 g 标志来表示全局替换,否则它将简单地替换它遇到的第一个。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-08
        • 2016-08-15
        • 1970-01-01
        • 2020-10-27
        • 2016-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多