如果我尝试这段代码:
<?php
$greets1="hello jack"; $greets2="hi john";
preg_match('/(hello )((?(?=jack)j))/',$greets1,$result);
?>
它在hello
和$result[1]
j
中写$result[2]
。
如果我将第3行更改为:
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);
这些都没有奏效。
答案 0 :(得分:3)
它在$ result [1]和$ result [2]中都没有写入任何内容。那是为什么?
因为没有匹配,匹配失败。您看到正则表达式引擎尝试匹配hello
后跟一个空格并且成功,然后它找到条件和检查我可以匹配jack
,是的我可以这样条件为真,现在我应该尝试匹配there
但引擎无法与此匹配,整个匹配尝试失败。
如何在前瞻中编写空格字符?
就像你在第一行中所做的那样,没有任何问题。问题是前瞻不会导致正则表达式从输入字符串中读取任何字符,因此在匹配hello
之后,正则表达式就是:
hello jack
^
在空格之前,然后是条件和前瞻,前瞻试图匹配后跟jack
的空格并且它成功,但正则表达式实际上不消耗输入字符串中的任何字符,现在我们在这里:
hello jack
^
你看到正则表达式仍然存在,它刚刚确认了前瞻,现在尝试匹配j
但现在有一个空格,所以它失败了,所以如果你把它改成了正则表达式就行了这样:
preg_match('/(hello)((?(?= jack) j))/',$greets1,$result);
^ notice the space here
正如@Hamza在他的评论中所说,你不需要条件在这里,如果你想匹配j
只有它是jack
的一部分,那么你可以单独使用前瞻这样:
preg_match('/(hello)( j(?=ack\b))/',$greets1,$result);