1

我想将所有非字母数字字符转换为连字符 (-)(破折号)以获得优雅的 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

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

4

2 回答 2

6

对于您的代码,只需替换

$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);

因为比 PHP 文档str_replace要快得多preg_replace,甚至推荐:

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

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

于 2013-04-27T13:08:32.347 回答
2

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

Any Authentic PHP Script  Third Party   10  tool to

你已经看到了——在某些地方留下了双倍的空格。

只需这样做:

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

它将所有出现的一个或多个非字母数字字符替换为单个破折号。

于 2013-04-27T13:11:23.807 回答