英語限定になりますが、文字列を URL で使えるような感じに変換するコードを試しに書いてみました。実際に使うにはもう少し詰める必要がありそうですが、大体こんな感じでしょうか。
1 2 3 4 5 6 7 8 | function string_to_url($str) { $slug = strtolower(preg_replace('/[^0-9a-zA-z\- ]|[\^\\\`\[\]_\/]/', '', $str)); $slug = preg_replace('/[ ]+/', ' ', $slug); $slug = preg_replace('/ /', '-', $slug); $slug = preg_replace('/^-/', '', $slug); return $slug; } |
1行目で URL でスラッグとして使える文字列以外の削除、2行目で2つスペースがある場合は1つにまとめる、3行目でスペースをハイフンに置き換え、4行目で先頭のハイフンを除去というような流れです。
もしユニークなスラッグを生成する必要があるのなら、データベースと照合して存在していれば後尾に数字を付けていくと良さそうです。また、数字を付けても既に存在している場合にも対応するために再帰的に読み込む必要があります。コードは CakePHP のモデルを想定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function slugCreate($slug) { if($data = $this->find('first', Array('conditions' => Array('slug' => $slug)))) { if(preg_match('/-([0-9]+)$/', $slug, $match)) { $num = (int) $match[1] + 1; } else { $num = 2; } $new_slug = preg_replace('/-[0-9]+$/', '', $slug) . '-' . $num; return $this->slugCreate($new_slug); } else { return $slug; } } |
同じスラッグがたくさん生成される場合は、もっと効率的な方法で URL を管理しておくと良さそうですが、何度も生成されるなら逆に日付を後尾に付けたりするのもありだと思いました。
コメント