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

时间:2013-04-27 13:04:12

标签: php regex

我想将所有非字母数字字符转换为连字符( - )(短划线)以获得优雅的网址。为此,我使用以下方法:

$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

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

2 个答案:

答案 0 :(得分:5)

对于您的代码,只需替换

$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()。

答案 1 :(得分:2)

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

Any Authentic PHP Script  Third Party   10  tool to

你已经看到它已经在某些地方留下了双重空间。

这样做:

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

它将一个或多个非字母数字字符的所有出现替换为单个短划线。