【问题标题】:How to get the shortest rather than longest possible regex match with preg_match()如何使用 preg_match() 获得最短而不是最长的正则表达式匹配
【发布时间】:2011-08-19 08:12:26
【问题描述】:

我有类似的字符串:

{{something1}} something2 {{something3}} something4

如何使用preg_match() 函数仅匹配“something1”?

我试过了:

preg_match("/\{\{(.*)\}\}/si",$content,$matches);

但这匹配太多,返回

something1}} something2 {{something3

我尝试将\b 添加到模式中,但也没有得到我想要的结果。

你能帮我解决这个问题吗?

【问题讨论】:

  • 这看起来像是某种不正确的 json,您是否可以在字符串到达​​您之前对其进行控制?
  • 第一个问题。问得当。赞成。

标签: php regex preg-match


【解决方案1】:

一个完整的答案 - 如果我们的 $var 是:

STARTT 
FIRST KKK
SECOND KKK

1) 如果我们使用:

$var = preg_replace('/STARTT(.*)KKK/', 'REPLACED-STRING', $var);

它将改变从 STARTT 到最后一个 KKK 的所有内容,结果将是:

REPLACED-STRING

2) 如果我们使用:

$var = preg_replace('/STARTT(.*?)KKK/', 'REPLACED-STRING', $var);

结果将是:

REPLACED-STRING 
SECOND KKK

【讨论】:

    【解决方案2】:

    试试这个:

    preg_match('|{{([^}]+)}}|si', $content, $matches);
    
    echo $matches[1];
    

    【讨论】:

    • 由于 OP 的结束“标签”是双 },因此很可能允许使用单个 }。不情愿的 .*? 更适合 M42 的建议,IMO。
    • 两种方法同样有效。我更喜欢使用[^ 尽可能具体。我相信使用 .*?比上面的正则表达式需要更多的步骤(虽然我不确定,稍后会测试),虽然可以忽略不计的性能差异只会把这归结为语法。
    • @Narek 对不起,我在想 preg_match_all - 我现在已经更正了。经过测试,它可以工作。
    【解决方案3】:

    使用非贪婪修饰符?

    preg_match("/\{\{(.*?)\}\}/si",$content,$matches);
                 here --^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多