假设我有一个字符串,如下所示:
"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
对应于第一个括号组的匹配项,...