代码之家  ›  专栏  ›  技术社区  ›  stack

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

  •  0
  • stack  · 技术社区  · 6 年前

    下面是我用来清理url的函数:

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

    这个regex也适用于大多数url。但是有一个例外:

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

    Demo

    \x{600}-\x{6FF} . 为什么要把它们移走?

    1 回复  |  直到 6 年前
        1
  •  1
  •   revo shanwije    6 年前

    正在删除的字符不在 \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