PHP preg_match与搜索的字符串不完全匹配

时间:2014-05-25 10:15:05

标签: php preg-match string-matching

你如何在字符串中找到一个字符串? 我的代码似乎不起作用:

if ( preg_match("/\b" . $needle . "\b/", $string) )
    return 'has-error';

鉴于此值:

$string = 'Sub-Category is required.';
$needle = 'Category';

返回TRUE。它应该是FALSE,因为我正在寻找的是" Category"。虽然单词本身在字符串中,但它仍然不被视为它。

谢谢!

4 个答案:

答案 0 :(得分:1)

在PHP中,单词边界(\b)在单词字符(\w)变为非单词字符(\W)的位置匹配。字母被认为是单词字符,而-是非单词字符。因此,字符串Sub-Category中有四个单词边界:字符串的开头,就在-字符之前,紧跟在它之后,以及字符串的结尾。

要回到您的问题,preg_match首先与Sub的{​​{1}}部分匹配(并失败),然后继续前进并尝试与{{1}匹配字符串的一部分(和成功)。因此,$string会返回Category,如:匹配找到。

为了避免这种情况,您必须手动创建单词边界,例如:

preg_match

在上面的示例中,我们手动将单词边界定义为TRUE,同时考虑匹配发生在字符串开头/结尾的可能性。

答案 1 :(得分:0)

试试这个正则表达式:

"/".$needle."/i"

所以代码将是:

if ( preg_match("/" . $needle . "/i", $string) )
    return 'has-error';

答案 2 :(得分:0)

我不确定我是否理解你的问题。但是当我做对了,你想测试你的字符串$string 完全是否等于你的$needle没有区分大小写)?如果是这种情况,我会建议这段代码:

function isAeuqalB($string,$needle) {
    if(preg_match("/^".$needle."$/i",$string)) {
        return true;  
    }
    return false;
}

isAeuqalB("Category","Category"); // returns true
isAeuqalB("Sub-Category","Category"); // returns false

您的错误在于您确实错过了^$,其中指出$string需要从{strong>开头来$needle转换为Category直到结束

您的代码只会检查单词$string是否属于{{1}}。


检查RegEx regex101.com的好网站是{{3}}。

答案 3 :(得分:0)

我找到了答案!

if ( preg_match("/\b[^\-]" . $needle . "/", $validationErrors) )
    return 'has-error';