2011-12-06 11 views
2

私はURLスラッグで使用する名前を削除するためにPHPを使用しています:$ titleは "This is the Title"または "This is Title & Subtitle"str_replaceでphp clean doubleダッシュ

上記の例「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; 
?> 

このコードを....ました。

しかし、場合によっては、ダブルダッシュ(「タイトル& More」が「title-more」に変わります)しかし、私はそれをきれいにすることはできません。

$ output2のコード行に入れましたが、何らかの理由で動作していないようです。試行錯誤の後、私は損失

おかげで...

+0

あなたのコードは、単に "タイトルより"、問題が何であるかに "タイトル&モア" をオンに? – xdazz

+0

それは私にとっても同じように機能しますか? – Andy

+0

xdazz - 問題は私がダブルダッシュを得ていたことでした。私が望むシングルダッシュではありませんでした。あなたは間違っていたので、「タイトル - その他」ではなく「タイトル - その他」に「タイトル&その他」が表示されました。私は私の問題を解決しました。 – Kevin

答えて

5

あなたは、単一の正規表現で同じことを解決することができます。

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

私が作成した唯一の変更は、正規表現内の末尾に「+」で、「前のグループの1回以上の出現」を意味していました。グループの長さに関係なく、すべての特殊文字グループが1つのダッシュに置き換えられました。

ただ、しかし、実際の質問に答えるために:

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

(私は真剣にかかわらず、変数の名前を変更する検討する)

3

I:あなたはあなたのケースではループ内で重複したダッシュを削減する必要がありますまったく同じ目標に達するために私自身が書いた関数を使っています。

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の部分を削除できます。

0

<space>&<space>を1つの-に置き換えることができます。 -の複数のインスタンスを単一のものに置き換えることができます。-

2

私の小さな機能を共有できます。すべての種類の言語でも機能します。 、ロシア語、ドイツ語、など

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); 
} 
0

使用この複数のスペース削除するには - これは、文字列にダッシュを追加した後preg_replace('/\s+/', ' ', $title)
を - 問題の上で寝た後str_replace(" ","-",strtolower($title));

0

、その後、これらの回答を読んで(感謝として、いつも)、それは何が起きているのかがついにわかった。

私のコードでは、3つのダッシュで私を残していた

: この:「書籍&雑誌」 たが、これに変更した「ブック---雑誌」(&は同様にダッシュやスペースで置き換えが3つのダッシュを与える)

私はstr_replaceを使ってダブルダッシュを1つにクリアしましたが、それでもダブルダッシュが残っていました。これが私を夢中にしていました。

私はこれを取得保管:「書籍 - 雑誌」

が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; 
?> 
0
+0

私はこれが古いと知っていますが、 ''/- +/''を使う代わりに' '/ - {2、} /''を使用して、2回以上のダッシュを対象にします。これがパフォーマンスに何らかの影響を与えるかどうかはわかりませんが、より厳しいターゲット設定が必要と感じています。 – Martie