我想将所有非字母数字字符转换为连字符( - )(短划线)以获得优雅的网址。为此,我使用以下方法:
$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
但是,正如您将注意到的那样,输出中有一些不需要的双连字符(--
)和一些三连字符(--
)。我希望每个单词之间只有一个连字符。我怎样才能实现目标?
答案 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_replace
比preg_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);
它将一个或多个非字母数字字符的所有出现替换为单个短划线。