多个正则表达式模式需要start ^和end $

时间:2018-03-29 15:21:46

标签: php regex preg-match pcre

如果给定[name=anystring]#anystring其中anystring是已删除任何空格的字符串,我希望返回anystring

在尝试两者之前,我已经成功地单独完成了它们。

$pattern = "/^#(.+)$/";
preg_match($pattern, '#anystring', $matches);
preg_match($pattern, '[name=anystring]', $matches);

$pattern = "/^\\[name=(.+)\\]$/";
preg_match($pattern, '#anystring', $matches);
preg_match($pattern, '[name=anystring]', $matches);

然后我尝试将它们组合起来。

# with start ^ and end $ on both
$pattern = "/^#(.+)$|^\\[name=(.+)\\]$/";
preg_match($pattern, '#anystring', $matches);
preg_match($pattern, '[name=anystring]', $matches);

# without start ^ and end $ on both
$pattern = "/^#(.+)|\\[name=(.+)\\]$/";
preg_match($pattern, '#anystring', $matches);
preg_match($pattern, '[name=anystring]', $matches);

虽然我“有点”得到我要找的东西,但第二种模式[name=(.+)]会返回一个包含三个元素的数组。

我应该在第一个模式后结束$并在第二个模式之前结束^吗?这会导致第二个模式返回一个包含三个元素的数组吗?

EDIT。显示一个版本如何显示更多数组元素

<?php

$pattern = "/^(?:#(.+)|\\[name=(.+)\\])$/s";
preg_match($pattern, '#anystring', $matches);
print_r($matches);
preg_match($pattern, '[name=anystring]', $matches);
print_r($matches);

(
    [0] =&gt; #anystring
    [1] =&gt; anystring
)
Array
(
    [0] =&gt; [name=anystring]
    [1] =&gt; 
    [2] =&gt; anystring
)

3 个答案:

答案 0 :(得分:2)

您可以使用非捕获组合并2个正则表达式:

(?:模式1 | PATTERN2)

我写了这个正则表达式,它将捕获两个字符串:

(?:\[\w+=(?<bracketword>\w+)\]|\#(?<word>\w+))

您的匹配将具有数组键支持词或单词。 请在下面的regex101链接上查看。

https://regex101.com/r/AmgHTS/1/

如果您愿意,也可以使用开始和结束字符串^和$。在我编辑的正则表达式中,我的测试字符串是两行(每个字符串一行),所以我也必须使用多行标志。

https://regex101.com/r/AmgHTS/2/

答案 1 :(得分:2)

仅使用anything来捕获Lookbehind,如下所示:

(?<=#|name=)([^\[#\]]+)

https://regex101.com/r/AmgHTS/4/

了解更多信息:

https://regex101.com/r/AmgHTS/5

答案 2 :(得分:1)

您正在寻找一个branch reset group,其中捕获组的编号从该组之前的最后一个ID开始:

^(?|#(.+)|\[name=(.+)])$
  ^^

请参阅regex demo

enter image description here

<强>详情

  • ^ - 字符串开头
  • (?| - 启动分支重置组
    • #(.+) - 一个#然后第1组捕获1个字符,尽可能多
    • | - 或
    • \[name= - [name=子字符串
    • (.+) - 第1组(再次)匹配除了换行符之外的1 +个字符,尽可能多
    • ] - ]
  • ) - 分支重置组的结束
  • $ - 字符串结束。