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

PHP preg_match与搜索的字符串不完全匹配,php,preg-match,string-matching,Php,Preg Match,String Matching,如何在字符串中准确地找到字符串? 我的代码似乎不起作用: if ( preg_match("/\b" . $needle . "\b/", $string) ) return 'has-error'; 鉴于此值: $string = 'Sub-Category is required.'; $needle = 'Category'; 它返回为TRUE。它应该是假的,因为我要找的是“类别”这个词。虽然单词本身在字符串中,但它仍然不被认为是它 谢谢 尝试使用此正则表达式: "/".$ne

如何在字符串中准确地找到字符串? 我的代码似乎不起作用:

if ( preg_match("/\b" . $needle . "\b/", $string) )
    return 'has-error';
鉴于此值:

$string = 'Sub-Category is required.';
$needle = 'Category';
它返回为TRUE。它应该是假的,因为我要找的是“类别”这个词。虽然单词本身在字符串中,但它仍然不被认为是它

谢谢

尝试使用此正则表达式:

"/".$needle."/i"
因此,代码将是:

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

我不确定我是否正确理解了你的问题。但是,当我答对后,您想测试字符串
$string
是否与
$pinder
完全相同(不区分大小写)?如果是这样,我建议使用以下代码:

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
开始到结束需要与
$pinder
相同

您的代码只检查单词
类别
是否是
$string
的一部分


一个很好的网站来检查你的is。

我找到了答案

if ( preg_match("/\b[^\-]" . $needle . "/", $validationErrors) )
    return 'has-error';
在PHP中,单词边界(
\b
)与单词字符(
\w
)变为非单词字符(
\w
)的位置相匹配。字母被认为是单词字符,而
-
是非单词字符。因此,字符串
子类别
中有四个单词边界:字符串的开头、字符的前面、后面以及字符串的结尾

要回到您的问题,
preg_match
首先与
$string
Sub
部分匹配(失败),然后继续并尝试与字符串的
类别
部分匹配(成功)。因此,
preg_match
返回
TRUE
,如:match found

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

preg_match("(^|[^\w-])" . $needle . "([^\w-]|$)/", $string)

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

不确定这是否与问题有关,但是你通常应该在正则表达式中使用变量。你想知道单词
Category
是否在
$string
中,或者
$string
是否等于
Category
?我想知道$string是否等于Category。如果你只想要相等,为什么不使用类似
strtower($needle)的东西呢==“category”
?这是因为$string可能包含不同的值,如果$pinder在$string中匹配,则应返回TRUE。这适用于此codezombie。我通过添加[^\-]解决了这个问题。嘿@user1781041-因为我仍然不确定我是否正确回答了您的问题,我只是想让您知道,您当前的正则表达式(“/\b[^\-]NEEDLE/”)也将返回
TRUE
字符串,如
这是一个类别
-哦,我错了!我不太理解您的问题…您的解决方案适合您的具体情况,可能这一个更一般:“/\b[^[\S]]”$pinder。“\b/I”