我想基于用户提交的文章标题创建一个以连字符分隔的字符串(用于URL)。假设用户输入文章标题为:
$title = "USA is going to deport indians -- Breaking News / News India";
我想把它转换成下面的
$slug = usa-is-going-to-deport-indians-breaking-news-news-india";
可能还有更多我想要转换的字符。例如'和'和',' '#', '%', 连字符(-)。
我尝试的一种方法是使用str_replace()
函数,但是使用这种方法,我必须多次调用str_replace()
,这很耗时。
另一个问题是标题字符串中可能有多个连字符(-),我想将多个连字符(-)转换为一个连字符(-)。
是否有可靠而有效的方法来解决这个问题?
您可以使用preg_replace
函数来做到这一点:
$string = "USA is going to deport indians -- Breaking News / News India";
$string = preg_replace("/[^w]+/", "-", $string);
echo strtolower($string);
输出:
usa-is-going-to-deport-indians-breaking-news-news-india
我建议使用sanitize_title()
函数查看文档
在这个任务中有三个步骤(创建一个"字符串);每个都需要在输入字符串上单独传递。
-
将所有字符转换为小写
-
将&符号替换为
[space]and[space]
,以确保该符号不被以后的替换和替换"one_answers" -
用字符连字符替换一个或多个非字母数字字符的序列。
多字节安全代码:(Demo)
$title = "ÛŞÃ is going to dèport 80% öf indians&citizens are #concerned -- Breaking News / News India";
echo preg_replace(
'/[^pLpN]+/u',
'-',
str_replace(
'&',
' and ',
mb_strtolower($title)
)
);
输出:ûşã-is-going-to-dèport-80-öf-indians-and-citizens-are-concerned-breaking-news-news-india
注意,str_replace()
中的替换可以在preg_replace()
调用中通过形成一个查找字符串数组和一个替换字符串数组来完成。然而,这可能是错误的经济——尽管函数调用会更少,但更昂贵的基于正则表达式的函数调用将在整个字符串上进行两次传递。
如果您希望将重音字符转换为ASCII字符,那么可以阅读将重音字符转换为其纯ASCII等效项中的不同技术。
如果您不担心多字节字符,那么相同方法的更简单版本将是:
echo preg_replace(
'/[^a-zd]+/',
'-',
str_replace(
'&',
' and ',
strtolower($title)
)
);
要清除结果字符串中的任何开头或结尾连字符,无条件调用trim($resultstring, '-')
可能是一个好主意。演示
要更深入地了解创建slug字符串的主题,请阅读PHP function to make slug (URL字符串)。