Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
preg_match_all PHP的条件正则表达式模式_Php_Regex_Preg Match All - Fatal编程技术网

preg_match_all PHP的条件正则表达式模式

preg_match_all PHP的条件正则表达式模式,php,regex,preg-match-all,Php,Regex,Preg Match All,我有一个模式。当某个特定的匹配组不存在时,即使跳过下一个匹配组,它也会跳过并查找另一个匹配 有4个捕获组 第一组,第二组,第三组,第四组 第三组并不总是在那里。在我的示例字符串中,有3组。第一组不包含第三组的任何字符。我想要第三组的条件语句。如果未找到任何字符,则应捕获空白或空格 演示: 应该是这样的: 但我不知道如何分配这个条件 如果第三个匹配项不存在,则应为空。我如何用正则表达式模式写这个 例如: $string = "\nTHIS IS FIRST PATTERN 63101 078915

我有一个模式。当某个特定的匹配组不存在时,即使跳过下一个匹配组,它也会跳过并查找另一个匹配

有4个捕获组

第一组,第二组,第三组,第四组

第三组并不总是在那里。在我的示例字符串中,有3组。第一组不包含第三组的任何字符。我想要第三组的条件语句。如果未找到任何字符,则应捕获空白或空格

演示:

应该是这样的:

但我不知道如何分配这个条件

如果第三个匹配项不存在,则应为空。我如何用正则表达式模式写这个

例如:

$string = "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000";

preg_match_all(
    "/([A-Z ,\.\-\&#\\\\n\/0-9&]+)(\d{10})([A-Z a-z]+)(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})/",
    $string,
    $matches
);
这应该输出如下内容:

array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(78) "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000"
    [1]=>
    string(84) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000"
    [2]=>
    string(87) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000"
  }
  [1]=>
  array(5) {
    [0]=>
    string(36) "\nTHIS IS FIRST PATTERN 63101"
    [1]=>
    string(42) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n"
    [2]=>
    string(45) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n"
  }
  [2]=>
  array(3) {
    [0]=>
    string(10) "0789158126"
    [1]=>
    string(10) "0406842931"
    [2]=>
    string(10) "0112853789"
  }
  [3]=>
  array(3) {
    [0]=>
    string(15) " "
    [1]=>
    string(15) " Third match "
    [2]=>
    string(15) " Third match "
  }
  [4]=>
  array(3) {
    [0]=>
    string(17) "0-0000000-000-0000"
    [1]=>
    string(17) "0-0000000-000-0000"
    [2]=>
    string(17) "0-0000000-000-0000"
  }
}
试试这个:

因为您的初始组有太多匹配项,所以扩展得太远。通过更改为非贪婪或惰性匹配(
*?
+?
),它将尽可能少地匹配。这使得它在使用以下模式时表现得更好

字符类(由
[
]
包围)用于匹配单个字符;我假设您只想匹配一个文本
&
\n
,因此将它们从字符类中移出。

尝试以下操作:

因为您的初始组有太多匹配项,所以扩展得太远。通过更改为非贪婪或惰性匹配(
*?
+?
),它将尽可能少地匹配。这使得它在使用以下模式时表现得更好


字符类(由
[
]
包围)用于匹配单个字符;我假设您只想匹配一个文本
&
\n
,因此将它们从字符类中移出。

使第一个量词非贪婪:
+
=>
+?
。为了获得更高效的模式,您也可以这样编写:this
&允许每个字符,而不是实体。e、 g.
&
a
m
p
。您需要提供更多的示例输入、预期匹配,并更清楚地告诉我们您现在的内容有什么问题。请将第一个量词设置为非贪婪:
+
=>
+?
。为了获得更高效的模式,您也可以这样编写:this
&允许每个字符,而不是实体。e、 g.
&
a
m
p
。您将需要提供更多的示例输入、预期匹配,并更清楚地告诉我们您现在的错误。谢谢!这就是我要找的!我是新的正则表达式模式。谢谢你提供的信息。谢谢!这就是我要找的!我是新的正则表达式模式。也谢谢你提供的信息。
((?:[A-Z ,.&#\/0-9-]|&|\\n)+?)(\d{10})([A-Z a-z]+)?(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})