我正在使用php来清除在url slug中使用的名称:,其中$ title可能如下所示:"这是标题"或"这是标题和副标题"
上面的例子我想分别改为"this-is-the-title"和"this-is-the-title-subtitle".所以,我做了这个代码......
<?php
$input1 = str_replace(" ","-",strtolower($title));
$output1 = preg_replace('/[^A-Za-z0-9-]/', '', $input1);
$output2 = str_replace("--","-",$output1);
echo $output2;
?>
Run Code Online (Sandbox Code Playgroud)
它运行良好,清除所有非字母数字,用破折号替换空格并使所有内容都小写.
但是,在某些情况下,它会返回双击("Title&More"变为("title - more").它应该是"title-more".我知道为什么双击,但我可以'似乎要把它清理干净.
我为$ output2添加了代码行,但由于某种原因它似乎没有工作.经过大量的反复试验,我感到很茫然.
谢谢...
你可以在一个正则表达式中解决相同的问题:
preg_replace('/[^a-z0-9]+/', '-', strtolower($title));
Run Code Online (Sandbox Code Playgroud)
我所做的唯一改变是+正则表达式中的尾随,意思是"前一组的一次或多次出现".现在,每组特殊字符都被替换为一个短划线 - 无论组是多长时间.
但是,仅仅是为了回答实际问题:在您的情况下,您需要减少循环中的重复短划线:
$output2 = $output1;
do {
$output1 = $output2;
$output2 = str_replace("--", "-", $output1);
} while ($output2 != $output1);
Run Code Online (Sandbox Code Playgroud)
(我会认真考虑重命名变量)