正则表达式在PHP中查找字符串中的模式

时间:2014-04-06 07:24:35

标签: php regex string preg-match

假设我有一个类似的字符串:

"lets refer to [[merp] [that entry called merp]] and maybe also to that entry called [[blue] [blue]]"

这里的想法是用[[name][some text]]替换<a href="name.html">some text</a>块。

所以我试图使用正则表达式来查找看起来像[[name][some text]]的块,但我遇到了极大的困难。

这是我认为应该工作的(在PHP中): preg_match_all('/\[\[.*\]\[.*\]/', $my_big_string, $matches)

但这只会返回一个匹配项,即'[[merp''blue]]'的字符串。如何让它返回两个匹配[[merp][that entry called merp]][[blue][blue]]

2 个答案:

答案 0 :(得分:4)

您正在寻找的正则表达式为\[\[(.+?)\]\s\[(.+?)\]\],并将其替换为<a href="$1">$2</a>

()括号内匹配的正则表达式模式被捕获,可以使用$ 1,$ 2,...进行反向引用。

regex101.com

上的示例

答案 1 :(得分:2)

Quantifiers*默认为greedy

这意味着,尽可能匹配满足条件。例如。在您的示例中,\[.*\]等正则表达式将匹配字符串中第一个[到最后一个]的所有内容。要更改默认行为并使量词 lazy ungreedy,reluctant ):

  • 使用U (PCRE_UNGREEDY) modifier使所有量词变得懒惰
  • 在特定量词之后放置?。例如。 .*?尽可能少的任何角色

1。)使用U - modifier模式看起来像:

/\[\[(.*)]\s*\[(.*)]]/Us

其他使用s(PCRE_DOTALL)modifier使.点也匹配换行符。并在示例字符串中的\s之间添加了一些][个空格。 \s[ \t\r\n\f]的{​​{3}}。

然后要替换两个捕获组(.*)shorthand


2。)而是使用?使每个量词变得懒惰:

/\[\[(.*?)]\s*\[(.*?)]]/s

Test on regex101.com


3。)如果预期在[...]内没有方括号,则不带修饰语。

/\[\[([^]]*)]\s*\[([^]]*)]]/

使用^否定Test on regex101.com允许[^]]*任意数量的字符,在][之间不是]。这不需要依赖贪婪。此外,不使用.,因此不需要s-modifier。

character class


根据您的示例替换所有3个示例:<a href="\1">\2</a>其中\1对应第一个Test on regex101.com的匹配项,...