【发布时间】:2018-03-29 15:21:45
【问题描述】:
如果给定[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=(.+)] 返回一个包含三个元素的数组。
我应该在第一个模式之后拥有并结束$,并在第二个模式之前开始^?这会导致第二个模式返回一个包含三个元素的数组吗?
编辑。展示一个版本如何显示更多的数组元素
<?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
)
【问题讨论】:
-
哦,我想我看到了问题的一部分。我想我应该只有一个
(....)。 -
.不匹配\n因此,假设您没有打开s(单行模式)标志,您的.+正则表达式将仅匹配给定的行。您可以将^添加到您的模式中,以强制它每次都从字符串的开头开始(否则它将继续尝试字符串中的每个字符,直到找到匹配项)但这取决于您 -
-我应该有开始和结束锚点吗? +仅当您需要您的正则表达式匹配您的整个输入字符串时。
-
@revo 是的,我确实需要。由于我有两种模式,这两种模式都需要单独吗?
-
不,他们不需要。将它们分组
^(?:#(.+)|\\[name=(.+)\\])$
标签: php regex preg-match pcre