【问题标题】:Remove <p>&nbsp;</p> from end of string?从字符串末尾删除 <p> </p>?
【发布时间】:2013-05-24 12:24:54
【问题描述】:

也许是一个新手问题:

我有一个类似的字符串:

$string = '<p>this is what we need.</p><p>&nbsp</p>';

如何使用 PHP 正则表达式(不是 substr)删除最后一个字符,即 &lt;p&gt;&amp;nbsp&lt;/p&gt;

我在这里发现了一个类似的问题:remove <br>'s from the end of a string 有解决方案:preg_replace('/(&lt;br&gt;)+$/', '', $string);

但将其更改为:preg_replace('/(&lt;p&gt;&amp;nbsp;&lt;/p&gt;)+$/', '', $string); 不起作用。

它抛出PHP Warning: preg_replace(): Unknown modifier 'p'

我想我错过了一些转义? 还是斜线?

感谢您的帮助。

【问题讨论】:

  • 请 str_replace 它将起作用。
  • 请注意,如果在行尾只出现一次,则不需要+(取决于您是要删除最后一次还是多次出现)。

标签: php regex string


【解决方案1】:

您正在使用斜杠字符作为正则表达式分隔符,也作为正则表达式的一部分(在结束 p 标记中),因此您应该转义它。所以:

/(<p>&nbsp;</p>)+$/

应该是

/(<p>&nbsp;<\/p>)+$/

而且似乎这不是正则表达式的工作,但这是你的电话。str_replacestr_ireplace 可以很好地完成这项工作

【讨论】:

  • 或者只是将分隔符更改为#
  • @BurhanKhalid 对;还有另一件事要注意:如果这些东西只需要从主题的末尾删除,那么只匹配结尾(用于标记结尾的^字符)的正则表达式可能会有所帮助
  • 感谢您的快速回复。我想使用 str_replace,但并不是我得到的所有字符串最后都有&lt;p&gt;&amp;nbsp&lt;/p&gt;。这就是为什么我认为我必须使用正则表达式。 # 那么你会如何使用 str_replace 呢?
  • @EchtEinfachTV 试试str_ireplace('&lt;p&gt;&amp;nbsp;&lt;/p&gt;', '', $string)
  • @EchtEinfachTV 您是否有机会尝试从 wordpress 生成的内容中删除空段落?
【解决方案2】:

这应该可以解决问题:

$string = '<p>this is what we need.</p><p>&nbsp</p>';
$pattern = "/<p[^>]*>[\s|&nbsp;]*<\/p>/"; 
$string = preg_replace($pattern, '', $string);

这将替换所有空的&lt;p&gt;,而不仅仅是包含&amp;nbsp;的那些

【讨论】:

    【解决方案3】:

    简单的方法

    $string = '<p>this is what we need.</p><p>&nbsp</p>';
    
    $string = str_replace('<p>&nbsp</p>','',$string);
    

    【讨论】:

    • 这是删除

      &nbsp

      的非常简单的方法
    【解决方案4】:

    不使用正则表达式,但保证只删除末尾的字符串:

    $string = '<p>&nbsp</p><p>the previous and next &nbsp should remain</p><p>nbsp</p><p>this is what we need.</p><p>&nbsp</p><p>&nbsp</p><p>&nbsp</p><p>&nbsp</p>';
    $lenString = strlen($string);
    $remove = '<p>&nbsp</p>';
    $lenRemove = strlen($remove);
    while (strrpos($string, $remove) === $lenString - $lenRemove) {
      $string = substr($string, 0, -$lenRemove);
      $lenString = strlen($string);
    }
    
    echo $string, PHP_EOL;
    

    这打印&lt;p&gt;&amp;nbsp&lt;/p&gt;&lt;p&gt;the previous and next &amp;nbsp should remain&lt;/p&gt;&lt;p&gt;nbsp&lt;/p&gt;&lt;p&gt;this is what we need.&lt;/p&gt;

    【讨论】:

      【解决方案5】:

      处理 html 内容(或 url)时处理斜杠的好方法是使用斜杠以外的其他分隔符,例如:

      $result = preg_replace('~(?><p>&nbsp;</p>)+$~', '', $string);
      

      那么你就不需要转义斜线了。

      请注意,您可以删除所有无用的:

      $result = preg_replace('~
       (?>
          <(\w++)[^>]*+>(?>\s++|&nbsp;|<br\s*+/?>)*</\1>  # empty tags
         |                                                # OR
          (?>\s++|&nbsp;|<br\s*+/?>)+                     # white spaces, br, &nbsp;
       )+$
                              ~xi', '', $string);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2011-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多