【问题标题】:PHP-REGEX: accented letters matches non-accented ones, and vice versa. How to achieve this?PHP-REGEX:重音字母匹配非重音字母,反之亦然。如何做到这一点?
【发布时间】:2012-05-31 16:06:13
【问题描述】:

我想做典型的高亮代码。所以我有类似的东西:

$valor = preg_replace("/(".$_REQUEST['txt_search'].")/iu", "<span style='background-color:yellow; font-weight:bold;'>\\1</span>", $valor);

现在,请求词可能类似于“josé”。有了它,我也想突出显示“jose”或“JOSÉ”或“José”等。

使用这个表达式,如果我写“josé”,它会匹配“josé”和“JOSÉ”(以及所有大小写变体)。它始终只匹配重音变体。如果我搜索“jose”,它匹配“JOSE”、“jose”、“Jose”,但不匹配重音的。所以我有部分我想要的,因为我对重音和非重音分别不区分大小写。

我需要它完全组合,这意味着重音(unicode)不敏感,所以我可以搜索“jose”,并突出显示“josé”、“josÉ”、“José”、“JOSE”、“JOSÉ”、“JoSé” , ...

我不想替换单词上的重音符号,因为当我在屏幕上打印它时,我需要看到真实的单词。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: php regex case-insensitive non-ascii-characters


    【解决方案1】:

    您可以尝试根据您的 txt_search 创建一个函数来创建您的正则表达式,将任何可能的匹配替换为所有可能的匹配,如下所示:

    function search_term($txt_search) {
        $search = preg_quote($txt_search);
    
        $search = preg_replace('/[aàáâãåäæ]/iu', '[aàáâãåäæ]', $search);
        $search = preg_replace('/[eèéêë]/iu', '[eèéêë]', $search);
        $search = preg_replace('/[iìíîï]/iu', '[iìíîï]', $search);
        $search = preg_replace('/[oòóôõöø]/iu', '[oòóôõöø]', $search);
        $search = preg_replace('/[uùúûü]/iu', '[uùúûü]', $search);
        // add any other character
    
        return $search;
    }
    

    然后您将结果用作 preg_replace 上的正则表达式。

    【讨论】:

    • 太棒了!我认为这样做会花费很多内存,但它运行得非常快,而且这是一个非常好的方法,因为它不是我需要做的 PHP 原生。工作了不起的人!你让我今天一整天都感觉很好!你能用你认为在函数上也有有趣的字符来扩展它吗?谢谢!
    • @Fernando 你相信你能将你的答案扩展到包括希腊字符 ά, έ, ί, ή, ό, ώ, ύ
    【解决方案2】:

    您可能必须解析搜索字符串,并修改正则表达式中的模式,以便 if 包含 [eéÉ] 之类的情况。将 e/E/é/É 的所有实例替换为一个包罗万象的 [eEéÉ]。对所有其他情况执行相同的操作。因此,在您的示例中,搜索模式将是 jos[éÉeE]

    ,而不是 Jose/José/JOSÉ

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 2019-12-11
      • 2011-12-01
      • 1970-01-01
      • 2020-09-14
      • 2016-04-02
      • 2013-07-01
      相关资源
      最近更新 更多