【问题标题】:PHP mb_strpos fails for Greek stringsPHP mb_strpos 对希腊字符串失败
【发布时间】:2015-03-24 12:51:47
【问题描述】:

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

$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;
}}

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

【问题讨论】:

标签: php strpos


【解决方案1】:

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

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


为了比较它们,您应该首先在两个字符串上使用normalizer_normalize(),以在它们的normalized forms 中获取它们。使用哪种类型归一化形式最终取决于您。有四个:

  1. NFD(规范分解
  2. NFC(规范分解,然后是规范组合
  3. NFKD(兼容性分解
  4. NFKC(兼容性分解,然后是规范组合

因为这种标准化完全在内部使用,只需忽略 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2016-04-02
    • 2013-09-30
    • 2012-05-16
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多