为什么在清理URL时删除了一些波斯字符?

时间:2018-11-24 17:15:10

标签: php regex pcre

这是我用来清理网址的函数:

function make_clean_url($url){

    $url_word_separator = "-";

    // To replace new lines with space
    $url = preg_replace('/\n+/', " ", $url);

    // To replace spaces with -
    $url = preg_replace('/\s+/', "-", $url);

    // To replace dot(s) with -
    $url = preg_replace('/\.+/', "-", $url);

    // To remove html-entitis characters i.e «
    $url = preg_replace("/&#?[a-z0-9]+;/i","",$url);

    // To remove eveything except numbers, dash, number-sign, space and alphabet characters
    $url = preg_replace('/[^\x{600}-\x{6FF}a-zA-Z0-9 #\-]/u', '', $url); -- issue on this

    // To trim surrounded spaces and dashs
    $url = trim($url, " $url_word_separator");

    return $url;
}

此正则表达式也适用于大多数URL。 Juse有一个例外:

echo make_clean_url("اﺻﻠﯽ ﺗﺮﯾﻦ ﻓﺮق اﺳﺘﻌﺎره ﻣﺼﺮﺣﻪ و ﻣﮑﻨﯿﻪ ﭼﯿﺴﺖ؟");
//=> ا--ق-اره--و--؟

Demo

看到了吗?它删除了大多数字母字符。为什么?这些字符使用\x{600}-\x{6FF}允许的波斯语。那么为什么要删除它们?

1 个答案:

答案 0 :(得分:1)

要删除的那些字符不在\u0600-\u06ff之外,因此可以预期该行为。这些是波斯字母的罕见形式,例如چ不同。

您可能需要使用\p{Arabic}而不是\x{0600}-\x{06ff}来包含阿拉伯文字。这就是整个功能:

function make_clean_url($url) {
    $url_word_separator = '-';
    $url = preg_replace('/\R+/', ' ', $url);
    $url = preg_replace('/[\s.]+/', '-', $url);
    $url = preg_replace('/&#?[a-z0-9]+;|[^\p{Arabic}a-z0-9#-]+/ui', '', $url);
    $url = trim($url, " $url_word_separator");
    return $url;
}

请参见live demo here