条件子模式匹配的问题

时间:2013-08-27 13:43:51

标签: php regex preg-match

如果我尝试这段代码:

<?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);

这些都没有奏效。

1 个答案:

答案 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);