如何使用连字符替换圆点,空格和逗号,并使用php避免使用双连字符?

时间:2018-09-27 07:55:40

标签: php regex string str-replace

当我替换字符串的空格,点和逗号时,有时会出现双连字符。

例如将check out the 1. place变成check-out-the-1--place

如何避免这种情况?我希望它是check-out-the-1-place-这样每个单词之间只有一个连字符。 这是我的代码:

str_replace([' ', ',', '.','?'], '-', strtolower($pathname));

现在,我知道为什么它会返回双连字符,但是我不知道如何解决。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:4)

  

如何避免这种情况?我希望它可以在1位签出-以便每个单词之间只有一个连字符。这是我的代码:

虽然Mohammad's answer在附近{em> 处,但是这里有一种更为完善的PCRE regex方法和其工作方式的解释,因此您可以根据需要使用它:< / p>

$str = trim(strtolower($pathname));
$newStr = preg_replace('/[\s.,-]+/', '-', $str);

这是如何工作的:

  • 匹配[\s.,-]+下面的列表中存在的单个字符
    • +量词在 1次与无限制次之间进行匹配,并尽可能多地匹配,并根据需要进行回馈(贪婪)
    • \s匹配任何空白字符(等于[\r\n\t\f\v])
    • .,-与列表.,-中的单个字符匹配(区分大小写)
    • 破折号-必须位于[]集的 end 处。

结果:

  

此:检查1.位

成为:

check-out-the-1-place

还有

  

此:查看-1.位置

成为

check-out-the-1-place


进一步:

我会走得更远,并假设您将其用于URL链接(a what?!);根据典型的网站代码,从字符串中去除所有所有个非字母数字字符,并替换为单个-

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

这是如何工作的:

  • 匹配^下面的列表中出现的单个字符[a-z0-9]+
    • +量词在 1次与无限制次之间进行匹配,并尽可能多地匹配,并根据需要进行回馈(贪婪)
    • a-z介于(索引97)和z(索引122)之间的单个字符(区分大小写)
    • 0-9的单个字符,介于0(索引48)和9(索引57)(区分大小写)之间
    • 末尾的i表示判断是不区分大小写

示例:

  

退房-不! 1.放置

成为:

check-out-the-1-Place

答案 1 :(得分:3)

您可以改为使用preg_replace()和用户正则表达式来选择多个特定字符。

$newStr = preg_replace("/[\s.,]+/", "-", $str)

demo中查看结果