如何将字符串中的所有非字母数字字符转换为连字符


How to convert all non-alphanumerical characters of a string to hyphens?

我想将所有非字母数字字符转换为连字符(-)(破折号),以获得美观的URL。为此,我使用以下方法:

$title = 'Any Authentic PHP Script / Third Party & @ 10 $ tool to'; 
$title .= 'Convert HTML to BBcode, BBcode to HTML';
$url = preg_replace("/[^0-9a-zA-Z ]/m", "", $title );
$url = preg_replace("/ /", "-", $url);

输出如下:

Any-Authentic-PHP-Script--Third-Party---10--tool-to-Convert-HTML-to-BBcode-BBcode-to-HTML

但是,正如您所注意到的,在输出中有一些不需要的双连字符(--)和一些三重连字符(--)。我希望每个单词之间只有一个连字符。我怎样才能达到我的目标?

对于您的代码,只需替换

$url = preg_replace("/ /", "-", $url);

$url = preg_replace("/'s+/", "-", $url);

并将所有空格(和制表符等)转换为只有一个连字符。's表示任意空格字符,+表示前面的一个或多个令牌

然而,你可以做得更好。将两个正则表达式替换为一个preg_replace

$url = preg_replace("/'W+/m", "-", $title );

…因为'W精确地表示非字母数字字符。

此外,如果您也不希望在结果中出现下划线(_),请使用

$url = preg_replace("/['W_]+/m", "-", $title );

作为旁注,下次如果你真的想做

preg_replace("/ /", "-", $url);

请这样做

str_replace(" ", "-", $url);

因为str_replacepreg_replace快得多,甚至从PHP文档中推荐:

http://php.net/manual/en/function.str-replace.php

如果你不需要花哨的替换规则(如正则表达式),你应该总是使用这个函数而不是preg_replace()。

这是因为首先所有非字母数字字符被删除,所以您的字符串变成

Any Authentic PHP Script  Third Party   10  tool to

你已经看到它在一些地方留下了双空格。

就这样做:

preg_replace("/[^a-zA-Z0-9]+/", "-", $subject);

中出现的一个或多个非字母数字字符替换为一个破折号。