Php clean双击破坏str_replace

Kev*_*vin 2 php mysql

我正在使用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添加了代码行,但由于某种原因它似乎没有工作.经过大量的反复试验,我感到很茫然.

谢谢...

sou*_*rge 5

你可以在一个正则表达式中解决相同的问题:

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)

(我会认真考虑重命名变量)