【问题标题】:Searching for words in a string在字符串中搜索单词
【发布时间】:2011-12-27 06:42:25
【问题描述】:

在 php 中搜索字符串并找到不区分大小写的匹配项的最佳方法是什么?

例如:

$SearchString = "This is a test";

从这个字符串中,我想找到单词 test、TEST 或 Test。

谢谢!

编辑

我还应该提到我想搜索字符串,如果它包含我的黑名单数组中的任何单词,请停止处理它。因此,“测试”的精确匹配很重要,但是大小写并不重要

【问题讨论】:

    标签: php


    【解决方案1】:

    如果你想查找单词,并且想要禁止“FU”而不是“fun”,你可以使用正则表达式whit \b,其中\b 标记单词的开始和结束, 所以如果你搜索 "\bfu\b" 如果不匹配 "fun", 如果你在分隔符后面添加一个“i”,它的搜索大小写不敏感, 如果你有一个像“fu”“foo”“bar”这样的单词列表,你的模式可能看起来像: "#\b(fu|foo|bar)\b#i",也可以使用变量:

    if(preg_match("#\b{$needle}\b#i", $haystack))
    {
       return FALSE;
    }
    

    编辑,添加多字示例,在 cmets 中要求字符转义:

    /* load the list somewhere */
    $stopWords = array( "word1", "word2" );
    
    /* escape special characters */
    foreach($stopWords as $row_nr => $current_word)
    {
        $stopWords[$row_nr] = addcslashes($current_word, '[\^$.|?*+()');
    }
    
    /* create a pattern of all words (using @ insted of # as # can be used in urls) */
    $pattern = "@\b(" . implode('|', $stopWords) . ")\b@";
    
    /* execute the search */
    if(!preg_match($pattern, $images))
    {
        /* no stop words */
    }
    

    【讨论】:

    • 如果您只想要精确(不区分大小写)匹配(例如,“test”而不是“testing”),Regex 绝对是最佳选择。
    • 做了一个速度测试,花时间在1000上搜索我的服务器,[preg_match] = 0.0028190612792969 [stristr] = 0.0051560401916504 [stris] = 0.0052568912506104 [substr_count] = > 0.005748987197876 [strpos_and_strtolower] => 0.0058009624481201 [explode_and_count] => 0.0069141387939453 由此代码生成:test.puggan.se/test/find_speed_test.phps
    • 如果某些变量是 URL,我将如何处理?如domain.com/test.jpg。我想扫描 URL 以查看它是否与我的黑名单测试字匹配
    • 需要转义的字符是:'[\^$.|?*+()',可以用addcslashes($needle, '[\^$.|?* +()');
    • 您好 Puggan,感谢您抽出宝贵时间提供帮助。我对 RegEx 几乎一无所知,您能否给我举个例子说明我需要做什么?目前我有代码
    【解决方案2】:

    你可以做一些事情之一,但我倾向于使用其中之一:

    您可以使用stripos()

    if (stripos($searchString,'test') !== FALSE) {
      echo 'I found it!';
    }
    

    您可以将字符串转换为一种特定的大小写,并使用strpos() 进行搜索

    if (strpos(strtolower($searchString),'test') !== FALSE) {
      echo 'I found it!';
    }
    

    我两者都做,没有偏好 - 一个可能比另一个更有效(我怀疑第一个更好)但我实际上不知道。

    举几个更可怕的例子,你可以:

    • 使用带有i 修饰符的正则表达式
    • if (count(explode('test',strtolower($searchString))) > 1)

    【讨论】:

    • 当我在我的服务器上测试时,在 needle 和 haystack 上执行 strtolower 比使用 stripos 慢 9%
    【解决方案3】:

    stripos,我想。大概它在找到匹配项时停止搜索,我猜它在内部会转换为小写(或大写),所以这和你得到的一样好。

    【讨论】:

      【解决方案4】:

      http://us3.php.net/manual/en/function.preg-match.php

      取决于你是否只想匹配

      在这种情况下,你会这样做:

      $SearchString= "This is a test";
      $pattern = '/[Test|TEST]/';
      preg_match($pattern, $SearchString);
      

      【讨论】:

      • 正则表达式对此太过分了。
      • 其实我想搜索字符串,如果它包含我的黑名单数组中的任何单词,请停止处理。
      【解决方案5】:

      我没有正确阅读问题。如其他答案所述,stripos 或 preg_match 函数将完全符合您的要求。

      我最初提供了 stristr 函数作为答案,但如果你只是想在另一个字符串中查找一个字符串,你实际上不应该使用它,因为它返回除了搜索参数之外的字符串的其余部分。

      【讨论】:

        猜你喜欢
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 2013-09-15
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多