【问题标题】:PHP preg_match is not exactly matching searched stringPHP preg_match 与搜索的字符串不完全匹配
【发布时间】:2026-02-13 11:25:01
【问题描述】:

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

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

给定这个值:

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

它返回 TRUE。它应该是 FALSE,因为我正在寻找的是“类别”这个词。虽然单词本身在字符串中,但它仍然不被认为是它。

谢谢!

【问题讨论】:

  • 不确定这是否与问题有关,但您通常应该在正则表达式中使用preg_quote() 变量
  • 你想知道Category这个词是否$string或者$string是否等于Category
  • 我想知道 $string 是否等于 Category。
  • 如果你只想要平等,为什么不使用strtolower($needle) == "category"之类的东西?
  • 这是因为 $string 可能包含不同的值,如果 $needle 在 $string 中匹配,它应该返回 TRUE。

标签: php preg-match string-matching


【解决方案1】:

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

回到您的问题,preg_match 首先匹配$stringSub 部分(并失败),然后继续尝试匹配字符串的Category 部分(并成功)。因此,preg_match 返回TRUE,如:找到匹配项。

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

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

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

【讨论】:

    【解决方案2】:

    我找到了答案!

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

    【讨论】:

    • 嘿@user1781041 - 因为我仍然不确定你的问题是否正确,我只是想让你知道,你当前的 RegEx ("/\b[^\-]NEEDLE /") 也将为this is a category 之类的字符串返回TRUE。 - regex101.com/r/bN3eB0
    【解决方案3】:

    我不确定我是否正确理解了您的问题。但是当我做对了时,您想测试您的字符串 $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 需要与$needle开始结束.

    您的代码仅检查单词 Category 是否是您的 $string 的一部分。


    检查您的RegEx 的好网站是regex101.com

    【讨论】:

    • 这个代码僵尸。我设法通过添加 [^\-] 来解决它。
    【解决方案4】:

    试试这个正则表达式:

    "/".$needle."/i"
    

    所以代码是:

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

    【讨论】:

    • 哦,我的错!我不太了解您的问题...您的解决方案适合您的具体情况,也许这个更通用:"/\b[^[\S]]".$needle."\b/i"