【问题标题】:Php clean double dash with str_replacephp 用 str_replace 清理双破折号
【发布时间】:2011-12-06 09:18:53
【问题描述】:

我正在使用 php 来清除要在 url slug 中使用的名称:,其中 $title 可能如下所示:“This is the Title”或“This is the Title & Subtitle”

上面的例子我想分别改成“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; 
?>

它工作得很好,清除了所有非字母数字,用破折号替换空格并使所有内容小写。

但是,在某些情况下,它会返回双破折号(“Title & More”变成(“title--more”)。它应该是“title-more”。我知道为什么会有双破折号,但是我似乎无法清理它。

我输入了 $output2 的代码行,但由于某种原因它似乎不起作用。经过大量的尝试和错误,我不知所措。

谢谢...

【问题讨论】:

  • 您的代码只是将“Title & More”变成了“title-more”,这是什么问题?
  • 对我来说也是这样吗?
  • xdazz - 问题是我得到的是双破折号,而不是我想要的单破折号。你错了,它把“Title & More”变成了“Title--More”而不是“Title-More”。不过我解决了我的问题,请继续关注。

标签: php mysql


【解决方案1】:

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

preg_replace('/[^a-z0-9]+/', '-', strtolower($title));

我所做的唯一更改是正则表达式中的尾随 +,意思是“前一组出现 1 次或多次”。现在每组特殊字符都被一个破折号替换 - 无论该组有多长。

只是为了回答实际问题:在您的情况下,您需要在循环中减少重复的破折号:

$output2 = $output1;
do {
    $output1 = $output2;
    $output2 = str_replace("--", "-", $output1);
} while ($output2 != $output1);

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

【讨论】:

    【解决方案2】:

    我正在使用自己编写的函数来达到完全相同的目标。

    function urlify($string, $utf8Input = false) {
        $string = strtolower(iconv($utf8Input ? 'UTF-8' : 'ISO-8859-1', 'ASCII//TRANSLIT', $string));
        $string = preg_replace('/[^a-z0-9]+/', '-', $string);
        $string = trim($string, '-');
        if (empty($string)) return '-';
        return $string;
    }
    

    如果您不使用使用重音字母的语言,则可以删除 UTF8 和 iconv 部分。

    【讨论】:

      【解决方案3】:

      我可以分享我的小功能。甚至适用于各种语言。俄语、德语等。

      public static function getSeo($str, $separator = '-'){
          $from = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
              'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё',
              'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы',
              'ь', 'э', 'ю', 'я', "Á", "À", "Â", "Ä", "Ă", "Ā", "Ã", "Å", "Ą", "Æ", "Ć", "Ċ", "Ĉ", "Č", "Ç", "Ď", "Đ", "Ð",
              "É", "È", "Ė", "Ê", "Ë", "Ě", "Ē", "Ę", "Ə", "Ġ", "Ĝ", "Ğ", "Ģ", "á", "à", "â", "ä", "ă", "ā", "ã", "å", "ą",
              "æ", "ć", "ċ", "ĉ", "č", "ç", "ď", "đ", "ð", "é", "è", "ė", "ê", "ë", "ě", "ē", "ę", "ə", "ġ", "ĝ", "ğ", "ģ",
              "Ĥ", "Ħ", "I", "Í", "Ì", "İ", "Î", "Ï", "Ī", "Į", "IJ", "Ĵ", "Ķ", "Ļ", "Ł", "Ń", "Ň", "Ñ", "Ņ", "Ó", "Ò", "Ô",
              "Ö", "Õ", "Ő", "Ø", "Ơ", "Œ", "ĥ", "ħ", "ı", "í", "ì", "i", "î", "ï", "ī", "į", "ij", "ĵ", "ķ", "ļ", "ł", "ń",
              "ň", "ñ", "ņ", "ó", "ò", "ô", "ö", "õ", "ő", "ø", "ơ", "œ", "Ŕ", "Ř", "Ś", "Ŝ", "Š", "Ş", "Ť", "Ţ", "Þ", "Ú",
              "Ù", "Û", "Ü", "Ŭ", "Ū", "Ů", "Ų", "Ű", "Ư", "Ŵ", "Ý", "Ŷ", "Ÿ", "Ź", "Ż", "Ž", "ŕ", "ř", "ś", "ŝ", "š", "ş",
              "ß", "ť", "ţ", "þ", "ú", "ù", "û", "ü", "ŭ", "ū", "ů", "ų", "ű", "ư", "ŵ", "ý", "ŷ", "ÿ", "ź", "ż", "ž"
          );
          $to = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Z', 'Z', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S',
              'T', 'U', 'F', 'H', 'C', 'Tch', 'Sh', 'Shtch', '', 'Y', '', 'E', 'Iu', 'Ja', 'a', 'b', 'v', 'g', 'd', 'e',
              'e', 'z', 'z', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'tch', 'sh',
              'shtch', '', 'y', '', 'e', 'iu', 'ja', "A", "A", "A", "A", "A", "A", "A", "A", "A", "AE", "C", "C", "C", "C",
              "C", "D", "D", "D", "E", "E", "E", "E", "E", "E", "E", "E", "G", "G", "G", "G", "G", "a", "a", "a", "a", "a",
              "a", "a", "a", "a", "ae", "c", "c", "c", "c", "c", "d", "d", "d", "e", "e", "e", "e", "e", "e", "e", "e", "g",
              "g", "g", "g", "g", "H", "H", "I", "I", "I", "I", "I", "I", "I", "I", "IJ", "J", "K", "L", "L", "N", "N", "N",
              "N", "O", "O", "O", "O", "O", "O", "O", "O", "CE", "h", "h", "i", "i", "i", "i", "i", "i", "i", "i", "ij", "j",
              "k", "l", "l", "n", "n", "n", "n", "o", "o", "o", "o", "o", "o", "o", "o", "o", "R", "R", "S", "S", "S", "S",
              "T", "T", "T", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "W", "Y", "Y", "Y", "Z", "Z", "Z", "r", "r",
              "s", "s", "s", "s", "B", "t", "t", "b", "u", "u", "u", "u", "u", "u", "u", "u", "u", "u", "w", "y", "y", "y",
              "z", "z", "z"
          );
          $str = str_replace($from, $to, $str);
          $str = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $str);
          $str = trim(preg_replace('/[^ A-Za-z0-9_-]/', ' ', $str));
          return preg_replace('/[ -]+/', $separator, $str);
      }
      

      【讨论】:

        【解决方案4】:

        使用它来删除多个空格 - preg_replace('/\s+/', ' ', $title)
        在此之后将破折号添加到字符串 - str_replace(" ","-",strtolower($title));

        【讨论】:

          【解决方案5】:

          您可以将&lt;space&gt;&amp;&lt;space&gt; 替换为单个-。或将多个- 实例替换为一个-

          【讨论】:

            【解决方案6】:

            在这个问题上睡了一觉之后,然后阅读了这些回复(一如既往地感谢),我终于明白发生了什么。

            我的代码给我留下了三个破折号: 这:“书籍和杂志” 正在更改为:“Books---Magazines”(& 替换为破折号和空格也给出 3 个破折号)

            我通过 str_replace 运行它以将双破折号清除为单破折号,但仍然留下双破折号,这就是让我发疯的原因。

            我不断收到这个:“书籍--杂志”

            原来 str_replace 确实有效。因为有三个破折号,所以第一个双破折号被替换了,现在是第三个破折号,但只剩下一个单破折号。

            因此,这个:“---”变成了这个“--”

            我需要再运行一次 str_replace 1 次才能解决问题。解决问题看起来就像我的原始代码,但多了 1 行。

            可能不是最优雅的解决方案,但它最终在我的脑海中起作用并且有意义。

            <?php 
            $input1 = str_replace(" ","-",strtolower($title)); 
            $output1 = preg_replace('/[^A-Za-z0-9-]/', '', $input1); 
            $output2 = str_replace("--","-",$output1); 
            $output3 = str_replace("--","-",$output2); 
            echo $output3; 
            ?>
            

            【讨论】:

              【解决方案7】:

              我认为这是最好的:

               $output =  trim(preg_replace('/-+/', '-', $str), '-');
              

              更多:How can I convert two or more dashes to singles and remove all dashes at the beginning and end of a string?

              【讨论】:

              • 我知道这是旧的,但您也可以使用'/-{2,}/',而不是使用'/-+/',它只会针对出现两次或更多的破折号。我不确定这是否对性能有任何影响,但我总觉得更严格的定位是要走的路。
              猜你喜欢
              • 1970-01-01
              • 2016-06-06
              • 2011-08-28
              • 2013-05-30
              • 2012-02-11
              • 2014-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-11
              相关资源
              最近更新 更多