1

私が引き受けた古いプロジェクトの htaccess ファイルで必要な、少しの正規表現に行き詰まっています。次のURIに一致させたい

/page?id=12
/admin/users-view?id=3242
/subscribe

クエリ文字列がある場合とない場合があり、複数のセグメントがある場合とない場合があります

.phpクエリ文字列の前に拡張子を挿入する必要があります。したがって、最初の例は次のようになります

/page.php?id=12

また、URI とファイル拡張子を一致させることもできないため、画像、js、または css ファイルが一致しません。

私はこれを思いついた:

^([/\w-]+)?/?

最後のポイントとは別に、必要なことを行います。私の正規表現スキルは貧弱なので、助けていただければ幸いです

4

2 に答える 2

2

正規表現でURIを解析しないでください。phpにはそのための関数が組み込まれています。

http://php.net/manual/en/function.parse-url.php

urlを構築する逆関数もあることに注意してください:

http://php.net/manual/en/function.http-build-url.php

正規表現の代わりにそれらを使用する必要があります。なぜなら、それらは(少なくとも)URLエンコードを正しく処理するからです。

于 2012-12-14T09:40:19.607 に答える
1

parse_urlで URL を分解し、操作後に元に戻すことを検討することをお勧めします。

ただし、純粋な正規表現ソリューションの場合、スラッシュ (または文字列の先頭) とピリオドを含まない疑問符で始まる文字列を見つけようとすると思います。

$url = preg_replace('~(^|/)[^.?]*(?=[?]|$)~', '$0.php', $url);

解決策は次のparse_urlようになります。

$urlParts = parse_url($url);
if(pathinfo($urlParts['path'], PATHINFO_EXTENSION) === null)
    $urlParts['path'] .= '.php';
$url = implode($urlParts);
于 2012-12-14T09:41:16.257 に答える