当我替换字符串的空格,点和逗号时,有时会出现双连字符。
例如将check out the 1. place
变成check-out-the-1--place
如何避免这种情况?我希望它是check-out-the-1-place
-这样每个单词之间只有一个连字符。
这是我的代码:
str_replace([' ', ',', '.','?'], '-', strtolower($pathname));
现在,我知道为什么它会返回双连字符,但是我不知道如何解决。
有人可以帮我吗?
答案 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)