如果给定[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] => #anystring
[1] => anystring
)
Array
(
[0] => [name=anystring]
[1] =>
[2] => anystring
)
答案 0 :(得分:2)
您可以使用非捕获组合并2个正则表达式:
(?:模式1 | PATTERN2)
我写了这个正则表达式,它将捕获两个字符串:
(?:\[\w+=(?<bracketword>\w+)\]|\#(?<word>\w+))
您的匹配将具有数组键支持词或单词。 请在下面的regex101链接上查看。
https://regex101.com/r/AmgHTS/1/
如果您愿意,也可以使用开始和结束字符串^和$。在我编辑的正则表达式中,我的测试字符串是两行(每个字符串一行),所以我也必须使用多行标志。
答案 1 :(得分:2)
答案 2 :(得分:1)
您正在寻找一个branch reset group,其中捕获组的编号从该组之前的最后一个ID开始:
^(?|#(.+)|\[name=(.+)])$
^^
请参阅regex demo
<强>详情
^
- 字符串开头(?|
- 启动分支重置组
#(.+)
- 一个#
然后第1组捕获1个字符,尽可能多|
- 或\[name=
- [name=
子字符串(.+)
- 第1组(再次)匹配除了换行符之外的1 +个字符,尽可能多]
- ]
)
- 分支重置组的结束$
- 字符串结束。