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

Friendly URL for all languages, using 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,如果可能的话;

这是我们在生产环境中的做法。效果很好,试试吧!

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

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

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

致电Text_Slug::slugify($str_to_be_slugified);

调用 Text_Slug::isSlugified($string); 以快速检查字符串是否被 slugified

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;
        }
    }
  1. 去掉最后一个-,如果有的话;
if (substr($string, -1) === '-') {
    $string = substr($string, 0, -1); // Remove last char
}
  1. strtolower(),如果可能;
return mb_strtolower($string);
  1. 优化 preg_replace,如果可能的话;

(以后可能会更新)

现在,我们一起穿上它:

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

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

并将你定义的字符添加为合法字符,否则没有什么可以用分隔符替换的,呃。