6

SOが質問へのリンクに使用するようなURL文字列を作成しようとしています。URLの書き換え(mod_rewrite)は考えていません。ページにリンクを生成することを検討しています。

例: 質問名は次のとおりです。

Is it better to use ob_get_contents() or $text .= ‘test’;

URL は次のようになります。

http://stackoverflow.com/questions/292068/is-it-better-to-use-obgetcontents-or-text-test

私が興味を持っている部分は次のとおりです。

is-it-better-to-use-obgetcontents-or-text-test

したがって、基本的には、URL を読み取り可能な状態に保ちながら、英数字以外のものをすべて削除しようとしています。以下を作成しましたが、それが最善の方法なのか、それともすべての可能性をカバーしているかはわかりません。

$str = urlencode(
    strtolower(
    str_replace('--', '-', 
    preg_replace(array('/[^a-z0-9 ]/i', '/[^a-z0-9]/i'), array('', '-'), 
    trim($urlPart)))));

だから基本的に:

  1. トリム
  2. 英数字以外とスペースを何も置き換えない
  3. 次に、英数字以外のすべてをダッシュ​​に置き換えます
  4. と置換する -。
  5. strtolower()
  6. urlencode()-- おそらく必要ありませんが、適切な測定のために。
4

1 に答える 1

5

すでに指摘したように、この場合は urlencode() は必要なく、trim() も必要ありません。私の理解が正しければ、ステップ 4 は連続した複数のダッシュを回避することですが、2 つ以上のダッシュを防ぐことはできません。一方、2 つの単語をつなぐダッシュ (「大規模」など) は、ソリューションによって削除されますが、SO では保持されているように見えます。

これが本当に最善の方法かどうかはわかりませんが、私の提案は次のとおりです。

$str = strtolower( 
  preg_replace( array('/[^a-z0-9\- ]/i', '/[ \-]+/'), array('', '-'), 
  $urlPart ) );

そう:

  1. スペース、ダッシュ、英数字のいずれでもない文字を削除します
  2. 連続する数のスペースまたはダッシュを 1 つのダッシュに置き換えます
  3. strtolower()
于 2009-02-12T08:30:04.430 に答える