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


Regular expression to find pattern in string in PHP

假设我有一个字符串,如下所示:

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

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

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

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

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

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

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

regex101.com 示例

*这样的量词默认是贪婪的

这意味着,尽可能匹配以满足条件。 例如,在您的示例中,像 '[.*'] 这样的正则表达式将匹配字符串中从第一个[到最后一个]的所有内容。要更改默认行为并使量词变得懒惰不贪婪、不情愿):

  • 使用 U (PCRE_UNGREEDY) 修饰符使所有量词延迟
  • 在特定
  • 量词之后放置一个?。 例如 尽可能少地.*?任何字符

1.) 使用 U 修饰符,图案可能如下所示:

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

另外使用了 s (PCRE_DOTALL) 修饰符使.点也与换行符匹配。并在示例字符串中的][之间添加了一些's空格。 's[ 't'r'n'f]的简写。

然后(.*)替换两个捕获组。regex101.com 测试


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

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

regex101.com 测试


3.) 没有修饰符的替代方案,如果预计[...]内没有方括号。

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

使用^否定字符类允许[^]]*任意数量的字符,这些字符不][] 之间。 这不需要依靠贪婪。也没有使用.,因此不需要 s 修饰符。

regex101.com 测试


根据您的样本替换所有 3 个示例: <a href="'1">'2</a>其中'1对应于第一个括号组的匹配项,...