Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多个正则表达式模式是否需要start^和end$_Php_Regex_Preg Match_Pcre - Fatal编程技术网

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

Php 多个正则表达式模式是否需要start^和end$,php,regex,preg-match,pcre,Php,Regex,Preg Match,Pcre,如果给定[name=anystring]或anystring,其中anystring是已删除任何空白的字符串,我希望返回anystring 在尝试两者之前,我成功地分别执行了它们 $pattern = "/^#(.+)$/"; preg_match($pattern, '#anystring', $matches); preg_match($pattern, '[name=anystring]', $matches); $pattern = "/^\\[name=(.+)\\]$/"; pre

如果给定[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] =&gt; #anystring
    [1] =&gt; anystring
)
Array
(
    [0] =&gt; [name=anystring]
    [1] =&gt; 
    [2] =&gt; anystring
)

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

?:模式1 |模式2

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

?:\[\w+=?\w+\]\?\w+

您的匹配项将包含数组关键字括号或单词。 在下面的regex101链接上查看它

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


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

?:模式1 |模式2

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

?:\[\w+=?\w+\]\?\w+

您的匹配项将包含数组关键字括号或单词。 在下面的regex101链接上查看它

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

您要查找的捕获组编号从组之前的最后一个ID开始:

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

细节

^-字符串的开头 ?|-分支重置组的开始 .+-a,然后是第1组capturin 1+字符,尽可能多 |-或 \[name=-a[name=子字符串 .+-第1组再次匹配除换行符以外的1+个字符,尽可能多 ]-a] -分支重置组结束 $-字符串的结尾。 您要查找的捕获组编号从组之前的最后一个ID开始:

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

细节

^-字符串的开头 ?|-分支重置组的开始 .+-a,然后是第1组capturin 1+字符,尽可能多 |-或 \[name=-a[name=子字符串 .+-第1组再次匹配除换行符以外的1+个字符,尽可能多 ]-a] -分支重置组结束 $-字符串的结尾。 要仅捕获具有这两种功能的任何内容,请使用如下Lookback:

(?<=#|name=)([^\[#\]]+)
有关详细信息,请参阅:

要仅捕获具有这两种功能的任何内容,请使用如下Lookback:

(?<=#|name=)([^\[#\]]+)
有关详细信息,请参阅:


哦,我想我看到了问题的一部分。我应该只有一个。。。。我想。。不匹配\n因此,假设未启用s单行模式标志,则“+的正则表达式将只匹配给定的行。您可以在模式前加“^”,强制它每次从字符串的开头开始,否则它会一直尝试字符串中的每个字符,直到找到匹配项为止。但这取决于您我应该有开始和结束锚吗+仅当您需要正则表达式与整个输入字符串匹配时。@revo Yes我确实需要。既然我有两种模式,这两种模式都需要单独使用吗?不,它们不需要。把他们分组^?:.+\\[姓名=.+\]$哦,我想我看到了问题的一部分。我应该只有一个。。。。我想。。不匹配\n因此,假设未启用s单行模式标志,则“+的正则表达式将只匹配给定的行。您可以在模式前加“^”,强制它每次从字符串的开头开始,否则它会一直尝试字符串中的每个字符,直到找到匹配项为止。但这取决于您我应该有开始和结束锚吗+仅当您需要正则表达式与整个输入字符串匹配时。@revo Yes我确实需要。既然我有两种模式,这两种模式都需要单独使用吗?不,它们不需要。将它们分组^?:.+\\[name=.+\]$Thank delboy,在regex101链接中,指定的多行标志在哪里。当我在php中使用您的模式时,我仍然得到一个三元素数组,因此我一定没有正确使用此标志。我的正则表达式使用命名的捕获组,因此它应该是$matches['bracketword']或$matches['word'],我认为您的字符串不会是多行的。如果删除其中一个测试字符串和多行标志,它应该会起作用啊,那些标志对我来说是隐藏的!原来PHP不喜欢g。我编辑了我的原始帖子,以展示如何返回两个或三个元素。虽然使用像word和bracketword这样的标签很好,但我希望找到相同的单词,但无法找到,因此我接下来希望返回具有相同元素数的数组。感谢delboy,在regex101链接中,指定的多行标志在哪里。当我在php中使用您的模式时,我仍然得到一个三元素数组,所以我一定没有正确使用这个标志
ld可以是$matches['bracketword']或$matches['word']我想您的字符串不会是多行的。如果删除其中一个测试字符串和多行标志,它应该会起作用啊,那些标志对我来说是隐藏的!原来PHP不喜欢g。我编辑了我的原始帖子,以展示如何返回两个或三个元素。虽然使用像word和bracketword这样的标签很好,但我希望发现同一个单词不能这样做,所以接下来我想返回一个元素数相同的数组。啊,两者都返回两个元素数组。我本来可以对付三个人的,但这让我很烦恼。请问首字母是多少?是用来做什么的?编辑不要介意。你刚才回答了@user1032531它是分组构造的一部分。。。。是构造方案。啊,都返回两个元素数组。我本来可以对付三个人的,但这让我很烦恼。请问首字母是多少?是用来做什么的?编辑不要介意。你刚才回答了@user1032531它是分组构造的一部分。。。。是施工方案,也有效。为什么此解决方案不需要像“.+或\w”这样的内容?@user1032531当您编写[^something]+时,这意味着它是。+除了一些同样有效的东西之外。为什么此解决方案不需要类似于“.+或\w”的内容?@user1032531当您编写[^something]+时,这意味着它是。+除了某个内容