对所有语言友好 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 />';
?>
谁能帮我解决以下问题:
- 删除最后一个
-
,如果有的话;
strtolower()
,如果可能的话;
- 优化
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;
}
}
- 去掉最后一个-,如果有的话;
if (substr($string, -1) === '-') {
$string = substr($string, 0, -1); // Remove last char
}
- strtolower(),如果可能;
return mb_strtolower($string);
- 优化 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
并将你定义的字符添加为合法字符,否则没有什么可以用分隔符替换的,呃。
我正在开发一个函数,它将所有字符串重写为友好的外观 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 />';
?>
谁能帮我解决以下问题:
- 删除最后一个
-
,如果有的话; strtolower()
,如果可能的话;- 优化
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;
}
}
- 去掉最后一个-,如果有的话;
if (substr($string, -1) === '-') {
$string = substr($string, 0, -1); // Remove last char
}
- strtolower(),如果可能;
return mb_strtolower($string);
- 优化 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
并将你定义的字符添加为合法字符,否则没有什么可以用分隔符替换的,呃。