需要稍加修改功能

时间:2014-04-18 19:00:33

标签: php regex slug

我正在编写一个自定义博客脚本,并且正在使用一个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'

虽然在预设时我可以编辑数据库并手动修复它,我想让它自动从字词中间删除特殊字符而不是用超级字母替换它们。

2 个答案:

答案 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);