1


0

PHP-複数のスラッシュを単一のスラッシュに減らす

複数のスラッシュを単一のスラッシュに減らすために使用する正規表現があります。 目的は、以下のように、Apacheでmod_rewriteを使用して、以前に人間が読めるリンクに変換されたURLを読み取ることです:

http://www.website.com/about/me

これは動作します:

$uri = 'about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes 'about/me'

これは機能しません:

$uri = '/about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes '/about/me'

各urlパラメーターだけで作業できる必要がありますが、2番目の例では、末尾のスラッシュを分解すると、2セグメントではなく3セグメントが返されます。 パラメータが空の場合はPHPで確認できますが、その正規表現を使用しているので、正規表現がすでにそれを処理してくれればいいので、セグメントについて心配する必要はありません検証。

何かご意見は?

7 Answer


7


この場合、str_replaceの方が高速になる場合があります

$uri = str_replace("//","/",$uri)

第二に:トリムを使用:http://hu.php.net/manual/en/function.trim.php

$uri = trim($uri,"/");


2


$ uriで2回目の置換を実行してみませんか?

$uri = preg_replace('#^/#', '', $uri);

これにより、末尾のスラッシュが削除されます。 すべてを1つのpreg_replaceで実行すると、私は打ち負かされます:)


2


_ 各urlパラメーターだけで作業できる必要がありますが、2番目の例では、末尾のスラッシュを分解すると、2セグメントではなく3セグメントが返されます。 _

これに対する1つの修正は、3番目の引数を `PREG_SPLIT_NO_EMPTY`に設定してpreg_splitを使用することです:

$uri = '/about//me';
$uri_segments = preg_split('#/#', $uri, PREG_SPLIT_NO_EMPTY);
// $uri_segments[0] == 'about';
// $uri_segments[1] == 'me';


2


これにより、文字列のダブルスラッシュが単一のスラッシュに変換されますが、このコードの利点は、文字列のプロトコル部分( http://)のスラッシュが保持されることです。

preg_replace("#(^|[^:])//+#", "\\1/", $str);


1


代わりに、「preg_split」を使用して文字列を分割し、サニタイズを完全にスキップすることができます。 ただし、空のチャンクを処理する必要があります。


1


3つの選択肢すべてを1つの正規表現に結合できます

$urls = array(
   'about/me',
   '/about//me',
   '/about///me/',
   '////about///me//'
);

print_r(
     preg_replace('~^/+|/+$|/(?=/)~', '', $urls)
);


1


遅いですが、これらすべてのメソッドは `http://`のスラッシュも削除しますが、これは削除します。

function to_single_slashes($input) {
    return preg_replace('~(^|[^:])//+~', '\\1/', $input);
}

# out: http://localhost/lorem-ipsum/123/456/
print to_single_slashes('http:///////localhost////lorem-ipsum/123/////456/');