【问题标题】:Need slight amendment to function功能需要稍作修改
【发布时间】:2014-06-03 08:08:37
【问题描述】:

我正在编写一个自定义博客脚本,其中的一部分是使用 slug 作为帖子 URL。到目前为止我的代码是

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

这对大多数部分都很有效,但是我注意到如果单词中间有一个特殊的字符,它只是用连字符替换它,将“can't”变成“can-t”而不是“cant” '

虽然在预设时我可以编辑数据库并手动修复它,但我希望它自动从单词中间去除特殊字符而不用连字符替换它们。

【问题讨论】:

  • 查看this function 作为这个的潜在替代品。
  • 尝试在第一次替换时将空格更改为空字符串。

标签: php regex slug


【解决方案1】:

尝试改变:

$str = preg_replace('/[^a-zA-Z0-9]/i', ' ', $str);

到:

$str = preg_replace('/[^a-z0-9\s]/i', '', $str);

这不会将空间放置在您不想要的位置,而是允许已经存在的空间(暂时)保留。然后你不会在单词中间有空格。 (我还从您的正则表达式中取出了A-Z,因为它不是必需的,因为字符串已经是小写的,而且您还使用了i 修饰符,这使得它无论如何都不区分大小写)。

【讨论】:

  • 感谢@John,对 PHP 还是个新手,对正则表达式也很陌生,从教程中得到了这个。
【解决方案2】:

您将在此处替换 '

$str = preg_replace('/[^a-zA-Z0-9]/i', ' ', $str);

把这个放在上面:

$str = preg_replace("/'/i", '', $str);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多