Php重音/特殊字符搜索和替换正则表达式

时间:2017-07-24 22:12:06

标签: php symfony search preg-match-all

我想在给定文本中查找搜索词,并返回与html突出显示的搜索词匹配的数组。

例如:

countMatch($needle, $haystack) { ... }

鉴于needle =“foo”,而haystack“foo bar foo foo”;

代码应返回此数组:

array:3 [
  0 => "<strong>foo</strong>"
  1 => "<strong>foo</strong>"
  2 => "<strong>foo</strong>"
]

我的代码工作正常,但我有重音和其他UTF8角色的巨大困境:

  1. 如果搜索字词包含utf8字符,如:(àáâãäçèéêëìíîïòóôõöùúûü),则该函数应匹配所有 fóo fõo etc ... WITH foo
  2. 大海捞针的相同案例: MATCH foo WITH ANY fóofófõo
  3. 此外,返回数组应显示突出显示的匹配项,并在搜索词之前和之后采用前100个characers和subsecuent 100个字符。
  4. 到目前为止:

    /**
     * Count existance of needle and return formated html string of needle
     * 
     * @param string $needle (search term)
     * @param string $haystack (text to search)
     * @return string|int
     */
    private function countMatch($needle, $haystack) {
        $matches = array();
        $response = array();
        $i = 0;
        preg_match_all("#(.{0,100}$needle.{0,100})#iu", $haystack, $matches);
        if (!empty($matches[0])) {
            foreach ($matches[0] as $match) {
                $i+=1;
                $response[$i] = "..." . str_ireplace($needle, "<span class='marker'>".$needle."</span>", $match) . "..."; 
            }
            return $response;
        } else {
            return 0;
        }
    }
    

    这很好用,甚至不区分大小写。但是,如果我输入“foó”我没有匹配,或者如果我输入“foo”并且干草堆包含“fóo,我没有匹配。

    预期结果:

    示例1:

    • needle =“foo”
    • haystack =“这是一个对吗?这个搜索词之前和之后还包含数以千计的其他字符。”
    • 预期结果:

      阵列:2 [   0 =&gt; “的 FOO ”   1 =&gt; “的 FOO ” ]

    示例2:

    • needle =“Foó
    • haystack =“这是一个foo对吗?在föo搜索词之前和之后还包含数以千计的其他字符。”
    • 预期结果:

      阵列:2 [   0 =&gt; “......的 FOO ....”   1 =&gt; “......的 FOO ....” ]

    注意:

    这个正则表达式:#(.{0,100}$needle.{0,100})#iu允许我粘贴匹配的前100个字符和后续100个字符。

    是的,正如您已经猜到的,这是一个使用MariaDB / MySQL FULLTEXT INDEX的小搜索引擎,数据库对这些字符,区分大小写等没有问题。但是,由于上述问题,我无法绘制搜索结果

    控制器的原始源代码: PlantaController

    (内部控制器,相关功能是getPlantaAction,buildResult, countMatch ,explodeSearch)

    查看(了解我如何使用Ajax绘制结果): Search form

0 个答案:

没有答案