PHP mb_strpos对希腊语字符串失败

时间:2015-03-24 12:51:48

标签: php strpos

我有一个文件浏览器,我正在尝试查找哪些文件名包含给定的查询。代码如下:

$query = (isset($_POST['s']))? mb_strtolower($_POST['s'],'UTF-8') : ''; 
$res = opendir($dir); 
    while(false!== ($file = readdir($res))) { 
if(mb_strpos(mb_strtolower($file,'UTF-8'),mb_strtolower($query,'UTF-8'),0,'UTF-8')!== false) {
    echo $file;
}}

对于英语单词,这种方法很好,但是当文本是希腊语时,结果并不像预期的那样,这意味着它适用于一些但不是所有希腊语单词。可以有人帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

字素可以呈现相同或相似但它们不以相同的方式表示。例如:

这些是直接从your comment复制的。


为了比较它们,您应首先在两个字符串上使用normalizer_normalize(),以便在normalized forms中获取它们。要使用哪种类型的规范化表单最终取决于您。有四个:

  1. NFD( Canonical Decomposition
  2. NFC( Canonical Decomposition,然后是Canonical Composition
  3. NFKD(兼容性分解
  4. NFKC(兼容性分解,然后是Canonical Composition
  5. 因为这种标准化正在内部使用,只是忽略NFC和NFKC,所以不需要重新组合。这使您可以选择NFD或NFKD - 规范或兼容。这些名称为您提供了一些关于等效性有多严格的线索。


    1.1 Canonical and Compatibility Equivalence

      

    规范等价是表示相同抽象字符的字符或字符序列之间的基本等效,正确显示时应始终具有相同的视觉外观和行为。

      

    兼容性等价是表示相同抽象字符的字符或字符序列之间较弱的等价,但可能具有不同的视觉外观或行为。


    为了搜索,我会选择后者。

    实施例

    $foo = "παράρτημα";
    $bar = "παράρτημα";
    var_dump($foo === $bar);
    var_dump(
        normalizer_normalize($foo, Normalizer::FORM_KD) ===
        normalizer_normalize($bar, Normalizer::FORM_KD)
    );
    

    输出:

    bool(false)
    bool(true)