我想转换用户输入字符串
"一些…不重要的,,像这样">
到
"像这样不重要的东西">
所以基本上删除所有重复出现的带有"-"的特殊字符。我在谷歌上搜索了一下,找到了这个
preg_replace('/[-]+/', '-', preg_replace('/[^a-zA-Z0-9_-]/s', '-', strtolower($string)));
我很想知道这是否可以用一个preg_replace()来完成。
只是为了澄清一下:将所有特殊字符和空格替换为连字符(-)。如果连续出现更多事件,请用单连字符替换它们
我的解决方案可以完美地工作,但我希望在一次呼叫中也能做到这一点
昨天也有类似的问题,但我手头没有。
在您当前的第一个模式中:
[^a-zA-Z0-9_-]
你只想找一个角色。如果你对一个或多个进行贪婪的匹配,正则表达式引擎会自动用一个替换其中的多个:
[^a-zA-Z0-9_-]+
^- + = one or more
然后仍然存在字符串中现有的-
未被捕获的问题,因此需要将它们从"not in"字符类中取出:
[^a-zA-Z0-9_]+
这样就可以做到:
preg_replace('/[^a-zA-Z0-9_]+/s', '-', strtolower($string));
由于它只是小写的,您也不需要查找A-Z
,只需要另一个缩写:
preg_replace('/[^a-z0-9_]+/s', '-', strtolower($string));
也可参见+
所属的重复和/或量化词(参见使用Star和Plus正则表达式的重复。info)。
此外,如果你看一下修饰符文档,您将看到s(PCRE_DOTALL)修饰符是不必要的:
$urlSlug = preg_replace('/[^a-z0-9_]+/', '-', strtolower($string));
希望这能对您有所帮助,并向您解释一下您正在使用的正则表达式,以及您可以在哪里找到更有用的文档。
试试这个:
preg_replace('/[^a-zA-Z0-9_-]+/s', '-', strtolower($string));