我有一个文件浏览器,我正在尝试查找哪些文件名包含给定的查询。代码如下:
$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;
}}
对于英语单词,这种方法很好,但是当文本是希腊语时,结果并不像预期的那样,这意味着它适用于一些但不是所有希腊语单词。可以有人帮我解决这个问题吗?
答案 0 :(得分:2)
字素可以呈现相同或相似但它们不以相同的方式表示。例如:
ά
在此表示为Unicode Character 'GREEK SMALL LETTER ALPHA WITH TONOS' (U+03AC) ά
在此处表示为Unicode Character 'GREEK SMALL LETTER ALPHA' (U+03B1),后跟Unicode Character 'COMBINING ACUTE ACCENT' (U+0301) 这些是直接从your comment复制的。
为了比较它们,您应首先在两个字符串上使用normalizer_normalize()
,以便在normalized forms中获取它们。要使用哪种类型的规范化表单最终取决于您。有四个:
因为这种标准化正在内部使用,只是忽略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)