【问题标题】:php: trim br tags from the beginning of a string?php:从字符串的开头修剪br标签?
【发布时间】:2011-02-19 12:12:43
【问题描述】:

我知道:

preg_replace('<br\s*\/?>', '', $string);

将从 $string 中删除所有 br 标记...

我们如何才能删除所有&lt;br&gt;&lt;br/&gt;&lt;br /&gt; 标签,只有它们位于$string 的开头? (在我的例子中,$string 是带有各种标签的 html 代码......)

【问题讨论】:

    标签: php regex


    【解决方案1】:

    只需添加适当的锚 (^):

    preg_replace('/^(?:<br\s*\/?>\s*)+/', '', $string);
    

    这将匹配多个&lt;br&gt;s 在字符串的开头

    (?:…) 是一个非捕获组,因为我们在这里只使用括号对表达式进行分组,而不是捕获它。修饰符并不是绝对必要的——(…) 也可以工作,但正则表达式引擎需要做更多的工作,因为它需要记住每个捕获的命中的位置和长度。

    【讨论】:

    • 您需要在正则表达式周围使用分隔符,因为不需要捕获任何内容,请使用非捕获组(?:...)
    • @salathe:是的……我已经添加了它们。我一开始只是复制了问题的代码,这就是我忘记它们的原因。 – 非捕获组也是一个好主意。
    • 感谢锚提示,这就是我所缺少的...您的正则表达式不会删除所有出现但与此帖子相结合:stackoverflow.com/questions/133571/… 正确的正则表达式应该是 /^(
      \s*)+/ 更改它,我会将答案标记为已接受
    • @Thanos:嗯,从你的问题来看,&lt;br&gt;s 之间似乎没有空格……
    • 感谢非捕获组知识滴!
    【解决方案2】:

    您忘记了正则表达式中的delimiters for PCRE。试试这个:

    $string = preg_replace('/^\s*(?:<br\s*\/?>\s*)*/i', '', $string);
    

    这还将删除换行标记之前、之间和之后的前导空白字符。

    一些解释:

    • ^\s* 将匹配字符串开头的任何空白字符
    • (?:&lt;br\s*\/?&gt;\s*)* 将匹配零次或多次出现的BR 标记(HTML 和 XHTML),后跟可选的空白字符

    【讨论】:

      【解决方案3】:
      $string = preg_replace( '@^(<br\\b[^>]*/?>)+@i', '', $string );
      

      应该匹配:

      <br>
      <br/>
      <br style="clear: both;" />
      etc
      

      【讨论】:

      • 现在小心 - 提问者希望它在一组特定的有限 HTML 上工作,这样可以避免Cthulu。疯狂在于你的“等”的路径。 :) 虽然我同意,
        很常见,值得考虑,因此受到支持。
      • 这似乎适用于我正在寻找的东西。这适用于任何合法的&lt;br&gt; 标签吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2016-05-12
      • 2018-08-31
      • 2011-03-01
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多