【问题标题】:php regex preg_match_all issuephp regex preg_match_all 问题
【发布时间】:2011-10-15 21:12:13
【问题描述】:

我正在尝试找出我在使用正则表达式时遇到的问题。

我在一个大的多行字符串上使用这个带有 preg_match_all 的正则表达式:

 /(\{(if|while|function|loop|\$|#)(.+)\})/

目前它可以匹配所有以 { 开头并以 } 结尾的文本,例如 {$test} 或 {$function="test()"}

但是,如果字符串中的一行包含两个匹配的块,则正则表达式返回整行,例如:

{$value.url}" class="link">{$value.title}

我不知道如何使正则表达式不与 (.+) 进行“贪婪”匹配。我之所以有 (.+) 是因为两个括号 {} 之间可能有任何字符/数字/下划线/句点/引号/空格。

谁能帮帮我?

【问题讨论】:

  • 这是否也验证或支持嵌套,如果字符串是{if {$fish} do }会发生什么
  • 这是一个很好的问题,但是我们使用的是不使用嵌套 {} 的模板引擎,您的示例是 {if="$fish"}This is a {$fish}{ /如果}。我们只需要一个快速请求来扫描我们所有的文件,以找出哪些文件中有 if/while/etc 语句。

标签: php regex preg-match preg-match-all


【解决方案1】:

尝试匹配除 } 和 } 之外的所有内容。

/(\{(if|while|function|loop|\$|#)([^\}]+)\})/

【讨论】:

  • 这会破坏嵌套(例如 {if {fish} do} 将返回 {if {fish}
  • 我认为任何非贪婪匹配都会破坏嵌套。那时我不得不想象简单的正则表达式不会削减它,它会变成完整的令牌解析器类型的东西。但我可能是错的。
  • 是的,但您可能不需要左大括号,所以[^\{\}] 至少会匹配内巢上的平衡对
【解决方案2】:

您可以通过添加像这样的问号.+? 来使.+ 不贪婪

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多