条件子模式匹配的问题


Problems with conditional subpattern matching

如果我尝试这个代码:

<?php
 $greets1="hello jack"; $greets2="hi john";
 preg_match('/(hello )((?(?=jack)j))/',$greets1,$result);
?>

它在CCD_ 2中写入hello,在$result[2]中写入j。如果我将第三行更改为:

 preg_match('/(hello )((?(?=jack)there))/',$greets1,$result);

它在$result[1]$result[2]中都不写入任何内容。为什么?

还有:我如何在展望中写空格字符?我尝试了很多方法:

 preg_match('/(hello)((?(?= jack)j))/',$greets1,$result);
 preg_match('/(hello)((?(?=' jack)j))/',$greets1,$result);
 preg_match('/(hello)((?(?=''' jack)j))/',$greets1,$result);

这些都不起作用。

它在$result[1]和$result[2]中都不写入任何内容。为什么?

因为没有匹配,所以匹配失败。您可以看到正则表达式引擎试图匹配后面跟有空格的hello,它成功了,然后它找到条件并检查我能匹配jack吗,是的,我能,所以条件是真的,现在我应该尝试匹配there,但引擎无法匹配,整个匹配尝试都失败了。

如何在展望中写入空格字符?

就像你在第一行所做的那样,没有什么错。问题是,前瞻性不会导致正则表达式从输入字符串中读取任何字符,因此在匹配hello之后,正则表达式为:

hello jack
     ^

就在空格之前,然后是条件和前瞻,前瞻试图匹配后面跟着jack的空格,它成功了,但正则表达式实际上没有消耗输入字符串中的任何字符,现在我们来了:

hello jack
     ^

您可以看到regex仍然存在,它刚刚确认了前瞻性,现在尝试匹配j,但现在有一个空格,所以它失败了,所以如果您将其更改为以下格式,您的正则表达式就会起作用:

preg_match('/(hello)((?(?= jack) j))/',$greets1,$result);
                                ^ notice the space here

正如@Hamza在评论中所说,你不需要这里的条件,如果你只想在jjack的一部分时匹配它,那么你可以像这样单独使用前瞻:

preg_match('/(hello)( j(?=ack'b))/',$greets1,$result);