Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 条件子模式匹配的问题_Php_Regex_Preg Match - Fatal编程技术网

Php 条件子模式匹配的问题

Php 条件子模式匹配的问题,php,regex,preg-match,Php,Regex,Preg Match,如果我尝试此代码: <?php $greets1="hello jack"; $greets2="hi john"; preg_match('/(hello )((?(?=jack)j))/',$greets1,$result); ?> 它在$result[1]和$result[2]中都不写入任何内容。为什么呢 还有:如何在前瞻中写入空格字符?我试过很多方法: preg_match('/(hello)((?(?= jack)j))/',$greets1,$result);

如果我尝试此代码:

<?php
 $greets1="hello jack"; $greets2="hi john";
 preg_match('/(hello )((?(?=jack)j))/',$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
,后跟一个空格,它成功了,然后它找到了条件并检查了can I match
jack
,是的,我可以,因此条件为真,现在我应该尝试匹配
那里的
,但引擎无法匹配,整个匹配尝试失败

如何在前瞻中写入空格字符

就像你在第一行所做的那样,这没有什么问题。问题在于,前瞻不会导致正则表达式从输入字符串中读取任何字符,因此在匹配
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);
它在$result[1]和$result[2]中都不写入任何内容。为什么呢

因为没有比赛,比赛失败了。您可以看到正则表达式引擎尝试匹配
hello
,后跟一个空格,它成功了,然后它找到了条件并检查了can I match
jack
,是的,我可以,因此条件为真,现在我应该尝试匹配
那里的
,但引擎无法匹配,整个匹配尝试失败

如何在前瞻中写入空格字符

就像你在第一行所做的那样,这没有什么问题。问题在于,前瞻不会导致正则表达式从输入字符串中读取任何字符,因此在匹配
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);

什么是预期匹配?如果没有正确使用条件模式,则不需要使用条件模式。那么为什么不使用
/(hello)(j)(?=ack)/
?另外,你说的也没有意义,你基本上是说如果有“杰克”,那么匹配“那里”
如果你确定有“杰克”,你会怎么匹配“那里”。所以基本上这就是它失败的原因。@user176795否,因为您要求正则表达式匹配“there”。但是没有“那里”。让我们进一步解释一下,您得到了
(你好)((?(=杰克)在那里))
。第一个很简单,它只是将“hello”分组到第1组中。现在让我们进一步了解,
(?(=杰克)那里)
:如果有杰克,那么匹配“那里”。在我们的示例中,有jack,所以我们的正则表达式基本上变成“(hello)(there)”。现在尝试将“hello jack”与
/(hello)(那里)/
匹配。不可能\有主意了吗?关于空间。第一个可能有效,但您忘记在
j
前面添加空格。否则,您将检查是否存在“jack
,但随后您将尝试立即匹配
j',而不首先占用该空间。所以:
/(hello)((?(?=jack)j))/
或者为了提高可读性,
/(hello)((?(?=[]jack)[]j))/
(也可以在自由间隔模式下工作)和关于“如果一个子模式失败,数组将无效”:如果一个子模式失败(在某些方面不是可选的),那么匹配将失败,而你一开始就找不到对手。无匹配->无子匹配。子匹配只是成功匹配的副产品。预期的匹配是什么?如果没有正确使用条件模式,则无需使用条件模式。那么为什么不使用
/(hello)(j)(?=ack)/
?另外,你说的也没有意义,你基本上是说如果有“杰克”,那么匹配“那里”
如果你确定有“杰克”,你会怎么匹配“那里”。所以基本上这就是它失败的原因。@user176795否,因为您要求正则表达式匹配“there”。但是没有“那里”。让我们进一步解释一下,您得到了
(你好)((?(=杰克)在那里))
。第一个很简单,它只是将“hello”分组到第1组中。现在让我们进一步了解,
(?(=杰克)那里)
:如果有杰克,那么匹配“那里”。在我们的示例中,有jack,所以我们的正则表达式基本上变成“(hello)(there)”。现在尝试将“hello jack”与
/(hello)(那里)/
匹配。不可能\有主意了吗?关于空间。第一个可能有效,但您忘记在
j
前面添加空格。否则,您将检查是否存在“jack
,但随后您将尝试立即匹配
j',而不首先占用该空间。所以: