如果给定 [name=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=(.+)]
返回一个包含三个元素的数组。
我应该在第一个模式之后结束 $
并在第二个模式之前开始 ^
吗?这会导致第二个模式返回一个包含三个元素的数组吗?
编辑。显示一个版本如何显示更多数组元素
<?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
)
最佳答案
您正在寻找 branch reset group其中捕获组的编号从组之前的最后一个 ID 开始:
^(?|#(.+)|\[name=(.+)])$
^^
参见 regex demo
详情
^
- 字符串的开始(?|
- 分支重置组的开始#(.+)
-#
然后第 1 组捕获 1+ 个字符,尽可能多|
- 或\[name=
-[name=
子串(.+)
- 第 1 组(再次)匹配除换行字符以外的 1+ 个字符,尽可能多]
-]
)
- 分支重置组结束$
- 字符串结尾。
关于php - 多个正则表达式模式需要开始 ^ 和结束 $,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49559735/