【问题标题】:Regular Expression matching syntax正则表达式匹配语法
【发布时间】:2012-04-15 02:16:40
【问题描述】:

我需要用其他东西替换方括号中任何文本的每个实例,每个方括号块都被单独处理。例如,以:

开头

[quote author=joe link=topic=765.msg4476#msg4476 date=1330380346] This is the quoted text [/quote] This is the new post

变成:

** This is the quoted text ** This is the new post

我尝试使用以下方法:

preg_replace('/\[.*\]/', '**', $msgtext);

我得到的是:

** This is the new post

它似乎从整个字符串中的第一个 '[' 字符到最后一个 ']' 字符匹配,即使在较大的文本中有一堆单独的方括号块。如何更改我的正则表达式以单独替换方括号之间的每个块?显然,正则表达式中的 .* 匹配所有内容,包括右括号,直到最后一个,但我希望它在遇到的第一个右括号处停止,然后在整个字符串中重复该逻辑。

【问题讨论】:

    标签: php regex pattern-matching


    【解决方案1】:

    默认情况下,PHP 的正则表达式进行贪婪匹配,您需要将其设置为不贪婪(例如使用 u 开关)

    preg_replace('/\[.*\]/U', '**', $msgtext);
    

    【讨论】:

      【解决方案2】:

      您需要使用 非贪婪 匹配,通过使用 /U 标志使整个模式贪婪:

      preg_replace('/\[.*\]/U', '**', $msgtext);
      

      或使用.*?(“零个或多个,最好尽可能少”)代替.*(“零个或多个,最好尽可能多”):

      preg_replace('/\[.*?\]/', '**', $msgtext);
      

      或者,您可以使用[^\]](“除] 之外的任何字符”)代替.(“除换行符之外的任何字符”):

      preg_replace('/\[[^\]]*\]/', '**', $msgtext);
      

      【讨论】:

      • 谢谢,伙计们,以上所有内容都像魅力一样。我使用了除版本之外的任何字符,但非贪婪也可以工作并得到相同的结果。解决了。​​
      • @BenCahan 如果您认为答案回答了您的问题,您应该接受答案(通过单击投票下方的复选标记)。
      【解决方案3】:

      这对我有用:

      preg_replace('/\[[^\]]*\]/', '**', $msgtext);
      

      【讨论】:

      • 哎呀!刚刚发布后看到 ruakh 3rd 答案是一样的。我投票赞成
      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多