如果我尝试这个代码:
<?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在评论中所说,你不需要这里的条件,如果你只想在j
是jack
的一部分时匹配它,那么你可以像这样单独使用前瞻:
preg_match('/(hello)( j(?=ack'b))/',$greets1,$result);