所有语言的友好URL,使用preg_match

时间:2016-02-11 06:59:38

标签: php preg-replace preg-match

我正在开发一个函数,它会将所有字符串重写为友好的URL。我在这个主题上看到的100%答案都只使用英文字母。

这是我到目前为止所做的:

<?php
function CleanURL($string, $delimiter = '-') {
    // Remove special characters
    $string = preg_replace("/[~`{}.'\"\!\@\#\$\%\^\&\*\(\)\_\=\+\/\?\>\<\,\[\]\:\;\|\\\]/", "", $string);

    // Replace blank space with delimeter
    $string = preg_replace("/[\/_|+ -]+/", $delimiter, $string);

    return $string;
}

echo CleanURL('Testing special characters: !@#$%^&*()_+[];\'\,./{}:"|<>?'); // Returns Testing-special-characters-
echo '<br />';
echo CleanURL('Bulgarian: текстово съобщение'); // Bulgarian-текстово-съобщение
echo '<br />';
echo CleanURL('Chinese: 短信'); // Chinese-短信
echo '<br />';
?>

有人可以帮我解决以下问题:

  1. 删除最后一个-(如果有的话);
  2. strtolower(),如果可能的话;
  3. 如果可能,优化preg_replace;

3 个答案:

答案 0 :(得分:1)

1。 您可以尝试trim($string,"-")。它删除了两端的所有破折号。

2。 使用多字节字符时,应使用mb_函数。使用它,您可以使用mb_strtolower($string);

3。 如果您只想删除非单词字符,也许这对您有用:preg_replace("/[^\p{L}]/ui","","Bulgarian: текстово съобщение");

这变为

function CleanURL($string, $delimiter = '-') {
    // Remove special characters
     $string = preg_replace("/[^\p{L}\/_|+ -]/ui","",$string);

    // Replace blank space with delimeter
    $string = preg_replace("/[\/_|+ -]+/", $delimiter, $string);

    // Trim delimiter
    $string =  trim($string,$delimiter);

    return mb_strtolower($string);
}

<强>更新

以下是我所做的preg内容的文档,以防您想要调整它: http://php.net/manual/en/regexp.reference.unicode.php

并将您定义的字符添加为合法字符,否则无法用分隔符替换,呃。

答案 1 :(得分:0)

我们在生产中如何做到这一点。效果很好,试一试!

编辑如果需要,只需添加更多$str=str_replace('','',$str);

编辑2 扩展此类,或使用以下链接中的此库来支持大多数字符。我认为这是你最好的选择,而不是先将所有内容转换为ascii。

http://iamseanmurphy.com/creating-seo-friendly-urls-in-php-with-url-slug/

致电Text_Slug::slugify($str_to_be_slugified);

调用Text_Slug::isSlugified($string);以快速检查字符串是否已经过度化

class Text_Slug
    {
        public static function slugify($str)
        {
            $str=str_replace("é",'e',$str); //Special chars
            $str=str_replace("É",'E',$str); //Special chars
            $str=str_replace(' ','-',$str);
            $str=preg_replace("/[^a-zA-Z0-9_\-]/i","",$str);
            return strtolower($str);
        }

        //Check if its slugified.
        public static function isSlugified($string)
        {
            if(preg_match("/[^a-zA-Z0-9_\-]/i", $string) > 0)
                return false;
            else
                return true;
        }
    }

答案 2 :(得分:0)

  1. 删除最后一个 - 如果有的话;
  2. if (substr($string, -1) === '-') {
        $string = substr($string, 0, -1); // Remove last char
    }
    
    1. strtolower(),如果可能的话;
    2. return mb_strtolower($string);
      
      1. 如果可能,优化preg_replace;
      2. (也许我稍后会更新)

        现在,我们把它放在一起:

        function CleanURL($string, $delimiter = '-') {
            // Remove special characters
            $string = preg_replace("/[~`{}.'\"\!\@\#\$\%\^\&\*\(\)\_\=\+\/\?\>\<\,\[\]\:\;\|\\\]/", "", $string);
        
            // Replace blank space with delimeter
            $string = preg_replace("/[\/_|+ -]+/", $delimiter, $string);
        
            // Remove the last -, if there is one
            if (substr($string, -1) === '-') {
                $string = substr($string, 0, -1); // Remove last char
            }
        
            return mb_strtolower($string);
        }