php中的Preg_match在我尝试时无法正常工作

php中的Preg_match在我尝试时无法正常工作,php,regex,preg-match,Php,Regex,Preg Match,我试图让它回显“匹配”,但它一直回显“不匹配”。我做错了什么 <?php $string = "anyway, why is it not matching?"; if (preg_match("~^([a-z]+ |[,.!?] ?)?(who|whom|what|where|when|why|how|which)[s]?\b~i", $string)) { echo "match"; } else { echo "not match"; } ?> 正则表达式的开头^([a-

我试图让它回显“匹配”,但它一直回显“不匹配”。我做错了什么

<?php

$string = "anyway, why is it not matching?";
if (preg_match("~^([a-z]+ |[,.!?] ?)?(who|whom|what|where|when|why|how|which)[s]?\b~i", $string)) {
echo "match";
}
else { echo "not match"; }

?>

正则表达式的开头
^([a-z]+|[,.!?])
表示字符串必须以任意数量的字母开头,后跟一个空格,或者正好一个标点符号后跟一个空格

您需要的是匹配一对一的单词,后跟零对一的标点符号,后跟零对一的空格:

^([a-z]+[,.!?]? ?)?
~^([a-z]+[,.!?]? ?)?(who|whom|what|where|when|why|how|which)[s]?\b~i

这将匹配第一组中的逗号和空格,以及第二组中的
为什么
,正如在Regexer和3v4l

[a-z]+|[,.!?])
这些空格必须在匹配项中,并且该
[s]
匹配
s
无或一次
,这可能不是您想要的,因为
[…]
通常是一组字符,而不是单个字符。你可以用
s?
做同样的事情,通常最好在单词周围使用
\b
,因为它匹配的不是
\w
(或者匹配
\w
,不管你想说什么)@ArtisticPhoenix那么什么是正确的preg\u匹配呢?我不知道你想“匹配”什么或者按照你没有给出的例子去做。(除了堆栈溢出,我还有其他事情要做,所以我今晚要离开)@ArtisticPhoenix我正在尝试匹配,以单个单词或标点符号开始。如果是标点符号,那么后面可能有空格,也可能没有空格。然后再匹配(为什么),因为可能有更好的方法,然后尝试盲修复一些东西,例如
[s]?
没有太多意义,例如它只匹配
whos,whom,what,where,when,whys,hows,whichs
,同样,将它放在字符组
[]
但它是可选的
,因此在很大程度上会被忽略。但我怀疑它是无缘无故放在那里的。因此,当涉及到Regex时,上下文真的很重要,否则就无法“逻辑地”知道为什么要放在那里。在逻辑上,也可以省略结尾处不以字符串结尾的匹配项
$
,但有时不匹配[,.!?],这就是它不匹配的时候。因此,请更新数据集,以使用量词
(如
[,.!?]?
)匹配零个或其中一个字符。我已经更新了我的答案来展示这一点。