【问题标题】:PHP preg_match_all match the closest valuePHP preg_match_all 匹配最接近的值
【发布时间】:2012-12-23 22:36:56
【问题描述】:

我的文字是这样的:

[if-abc]content of abc[/if] [if-def]content of def[/if]

我想匹配:

[if-abc]content of abc[/if] and then [if-def]content of def[/if]

但我当前的功能匹配整个事情。我怎样才能使它匹配关闭 [/if] 标记的第一次出现

$m = null;
preg_match_all('/\[if-([a-z-]*)\](.*)\[\/if\]/', $source, $m);

除非在同一行中存在多个条件,否则此方法有效。

【问题讨论】:

  • 正则表达式不是此任务的正确工具。改为解析文本。
  • 它似乎工作得很好,我应该解析的原因是什么?
  • 因为迟早你会遇到问题,你不能那么容易地解决,特别是因为你会忘记事情并引入安全问题。同样的原因,为什么在 HTML 上应用正则表达式是一个坏主意(等等;))。
  • 感谢您的想法,感谢它

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


【解决方案1】:

用...制作你的星量词non-greedy

preg_match_all('/\[if-([a-z-]*)\](.*?)\[\/if\]/', $source, $m);

这样.* 构造将从“根本没有符号”状态开始匹配,逐渐扩大它,一次一个符号 - 并且在遇到 第一个 @ 时将停止匹配987654324@ 字符串流中的一部分。否则它实际上从消耗 all 字符串开始,一次释放一个符号 - 并在它面对字符串流中的 last [/if] 部分时停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2015-03-18
    • 1970-01-01
    相关资源
    最近更新 更多