3

PHP を使用して、次のような不正な URL を自動的に修正するにはどうすればよいですか。

/db/?param1=sas23456sdfd&param2=1368115104&parama3=more/resource
    or...
/db?param1=sas23456sdfd&param2=1368115104&parama3=more/resource

次のように適切な順序に並べ替えますか?:

/db/resource/?param1=sas23456sdfd&param2=1368115104&parama3=more
    or...
/db/resource?param1=sas23456sdfd&param2=1368115104&parama3=more

質問する前に、不正な URL の原因は完全に私の手に負えません。元のクエリ文字列パラメーターの後に末尾のスラッシュとエンドポイントを愚かにも追加することを主張するクライアント ライブラリが原因です。幸いなことに、私は PHP リバース プロキシ スクリプトを介してリクエストをやり取りしているので、修正できる可能性があります。ご注意ください:

  1. クエリ文字列が存在する場合と存在しない場合があります
  2. クエリ文字列が適切に配置される場合があります
  3. クエリ文字列パラメーターの名前と値は異なります
  4. クエリ文字列パラメーターの数は変更される可能性があります
  5. クエリ文字列は常に「/」に続くとは限りません (db/?param=val または db?param=val)
  6. 不正な URL には常に「?param(s)=value/」パターンが含まれます。

PHPでこの混乱を修正する方法についてのアイデアはありますか?

4

2 に答える 2

2

クライアント ライブラリは本来あるべきことを行っていない (または別の仕様向けに設計されている) ため、クライアント ライブラリを置き換えたり修正したりする方がおそらく簡単です。

しかし、あなたを助けることができる正規表現があります。

/(.*?)(\/)?(\?.*)(\/.*)/

これは、例の不正な形式の文字列に一致し、結果の文字列には一致しません。Rubularで動作するデモを参照してください。

次のように使用できます (これが最適な処理方法かどうかはわかりませんが、出力を修正してから、壊れた入力で作業することをお勧めします)。

$matches = array();
$is_malformed = preg_match('/(.*?)(\/)?(\?.*)(\/.*)/', $_SERVER['REQUEST_URI'], $matches);
if($is_malformed) {
    $_SERVER['REQUEST_URI'] = $matches[1] . $matches[4] . $matches[2] . $matches[3];
}
于 2013-05-11T09:17:28.607 に答える
0

別の質問でもう少し一般的に問題に取り組み、@ Yogesh Suthar の助けを借りて、これを実用的な解決策として考え出しました (改善を歓迎します):

$qs_match = array();
$is_malformed = preg_match('$\?(.*?)\/$s', $_SERVER['REQUEST_URI'], $qs_match);
if($is_malformed) {
    $uri_parts = explode('?',$_SERVER['REQUEST_URI']); //break apart at the first query string param
    //per https://stackoverflow.com/questions/4250794/simple-php-regex-question
    $_SERVER['REQUEST_URI'] = $uri_parts[0].preg_replace('/^[^\/]*\//' , '/', $uri_parts[1]).'?'.$qs_match[1]; //recombined but modified part 2
}
于 2013-05-11T15:19:19.710 に答える