Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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正则表达式捕获第一个模式及其后的所有内容,即使它重复。_Php_Regex - Fatal编程技术网

PHP正则表达式捕获第一个模式及其后的所有内容,即使它重复。

PHP正则表达式捕获第一个模式及其后的所有内容,即使它重复。,php,regex,Php,Regex,我正在为聊天机器人进行语音识别,我需要它简单地捕获模式(包括模式)后的所有内容,并将其放入一个输出数组中。我以为这会很容易,但我不能让它工作。最初的分割模式可能会重复,如果它在字符串中稍后出现,它似乎会使用该模式作为分割点,而不是第一次出现。也许有一种简单的方法可以做到这一点,但我一直在寻找 $input_line = "aaaa delimit bbbb delimit cccc delimit dddd delimit eeee"; preg_match("/(.+) (delimit)

我正在为聊天机器人进行语音识别,我需要它简单地捕获模式(包括模式)后的所有内容,并将其放入一个输出数组中。我以为这会很容易,但我不能让它工作。最初的分割模式可能会重复,如果它在字符串中稍后出现,它似乎会使用该模式作为分割点,而不是第一次出现。也许有一种简单的方法可以做到这一点,但我一直在寻找

$input_line = "aaaa delimit bbbb delimit cccc delimit dddd delimit eeee";

preg_match("/(.+) (delimit) (.+)/", $input_line, $output_array);
我希望其中一个输出匹配是

 => delimit bbbb delimit cccc delimit dddd delimit eeee
但我得到的输出阵列是

array(4
0=>aaaa delimit bbbb delimit cccc delimit dddd delimit eeee
1=>aaaa delimit bbbb delimit cccc delimit dddd
2=>delimit
3=>eeee)
所以我只想抓住第一个定界和它之后的一切,即使还有其他定界。我试过:

(.+) ((delimit) (.+)){1}

以及使用*,?,{}的其他变体,但似乎无法获得它。在本例中,由4个字母组成的组(即aaaa)可以表示用户可能与定界词一起输入的任何字符串

阵列中的元素太多是因为在模式中使用了太多的捕获组。由于正则表达式egnine从左到右解析字符串,您可以将模式定义为
/pattern.*/s
-它将找到第一个
模式
,然后将匹配任何0+字符(甚至包括换行符,因为当点匹配任何字符时,
/s
修饰符启用点调用模式)

要匹配第一个
定界
之前的任何内容,然后匹配它后面的内容,请在
定界
之前使用
(.*)
,以便惰性
*?
将匹配第一次出现的
定界
之前的任何0+字符:

preg_match("/(.*?)(delimit.*)/s", $input, $match)
$res = preg_split('~(?=delimit)~', $str, 2)[1];

示例代码:

$input_line = "aaaa delimit bbbb delimit cccc delimit dddd delimit eeee";
if (preg_match("/(.*?)(delimit.*)/s", $input_line, $m)) {
  echo $m[1] . "\n";
  echo $m[2];
}
输出:

aaaa
delimit bbbb delimit cccc delimit dddd delimit eeee

请参阅

使用
preg\u split的其他可能方法

preg_match("/(.*?)(delimit.*)/s", $input, $match)
$res = preg_split('~(?=delimit)~', $str, 2)[1];
模式使用一个向前看(向前看)在分隔符开始的位置成功。第三个参数设置为
2
(两部分),这样,正则表达式引擎在第一次出现时停止搜索


显然,如果“分隔符”是一个固定字符串,不要使用正则表达式,而是使用
explode

您过度使用了捕获组。只需使用
preg_match(“/.*”(different.*)/s“,$input,$match)
(请注意,第一个
*
是惰性的-
*?
可以到达第一个
different
)。或者甚至
preg_match(“/different.*/s”,$input_line,$m)
请告诉我我是否正确理解了这个问题。是的,这似乎满足了我的需要。我的错误似乎是不理解如何使用*?就像你那样,使用了太多的捕获组。谢谢你的帮助!对不起,我不常在这里,我在哪里可以接受你的回答?看到了吗