0

我想转换用户输入字符串

“某事...... un// 重要的,,, 像这样的”

“像这样不重要的东西”

所以基本上用“-”删除所有重复出现的特殊字符。我用谷歌搜索并来到了这个

preg_replace('/[-]+/', '-', preg_replace('/[^a-zA-Z0-9_-]/s', '-', strtolower($string)));

我很想知道这是否可以用一个 preg_replace() 来完成。

只是为了清除问题:用连字符(-)替换所有特殊字符和空格。如果更多的出现连续出现,用单个连字符替换它们

我的解决方案可以按我的意愿完美运行,但我希望在一次通话中做同样的事情

4

2 回答 2

3

昨天有一个类似的问题,但我手头没有。

在您当前的第一个模式中:

[^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 ) 。

此外,如果您查看修饰符Docs ,您会发现 s (PCRE_DOTALL)修饰符不是必需的:

$urlSlug = preg_replace('/[^a-z0-9_]+/', '-', strtolower($string));

希望这对您有所帮助并向您解释您正在使用的正则表达式以及您可以在哪里找到总是有用的更多文档。

于 2012-09-29T07:19:49.193 回答
0

尝试这个:

preg_replace('/[^a-zA-Z0-9_-]+/s', '-', strtolower($string));
于 2012-09-29T07:19:38.653 回答