我想将所有非字母数字字符转换为连字符(-)(破折号),以获得美观的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_replace
比preg_replace
快得多,甚至从PHP文档中推荐:
如果你不需要花哨的替换规则(如正则表达式),你应该总是使用这个函数而不是preg_replace()。
这是因为首先所有非字母数字字符被删除,所以您的字符串变成
Any Authentic PHP Script Third Party 10 tool to
你已经看到它在一些地方留下了双空格。
就这样做:
preg_replace("/[^a-zA-Z0-9]+/", "-", $subject);
将中出现的一个或多个非字母数字字符替换为一个破折号。