我正在编写一个自定义博客脚本,并且正在使用一个slug来发布帖子。我到目前为止的代码是
public function get_slug($str) {
// convert to lowercase
$str = strtolower($str);
// remove special chars
$str = preg_replace('/[^a-zA-Z0-9]/i', ' ', $str);
// remove what space from beginning and end
$str = trim($str);
// remove repeat spaces
$str = preg_replace('/\s+/', ' ', $str);
// replace spaces with hyphens
$str = preg_replace('/\s+/', '-', $str);
return $str;
}
这对大多数部分来说都很有用,但是我注意到如果在单词的中间有一个特殊的字符,它只是用一个连字符转换来代替它,而不能用#t;' t'进入' can-t'而不是' cant'
虽然在预设时我可以编辑数据库并手动修复它,我想让它自动从字词中间删除特殊字符而不是用超级字母替换它们。
答案 0 :(得分:2)
尝试更改:
$str = preg_replace('/[^a-zA-Z0-9]/i', ' ', $str);
为:
$str = preg_replace('/[^a-z0-9\s]/i', '', $str);
这不会将空格放在您不想要它们的位置,而是允许那些已存在的空间(暂时)。然后你不会在单词的中间有空格。 (我也从你的正则表达式中取出了A-Z
,因为它不是必需的,因为字符串已经是小写的,你也使用了i
修饰符,这使得它不区分大小写。)
答案 1 :(得分:0)
您正在替换此处的'
:
$str = preg_replace('/[^a-zA-Z0-9]/i', ' ', $str);
在上述之前加上:
$str = preg_replace("/'/i", '', $str);