0

If I try this code:

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

It writes hello in $result[1] and j in $result[2]. If I change the 3rd line to:

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

It writes nothing in both $result[1] and $result[2]. Why is that?

And also: how can I write the space character in the lookahead? I tried in many ways:

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

No one of these worked.

4

1 回答 1

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 在他的评论中所说,您不需要这里的条件,如果您只想匹配 aj的一部分,jack那么您可以像这样单独使用前瞻:

preg_match('/(hello)( j(?=ack\b))/',$greets1,$result);
于 2013-08-27T14:04:43.047 回答