2011-10-29 16 views
-4

私は要素をキャプチャするために正規表現でURLを解析しようとしますが、どうやって行うのかわかりません。 URLのサンプル:解決する複雑な正規表現

  • $ path_ =>配列(タイプ=>コテージ、ページと$ path_ =>配列(タイプ=>コテージ)
  • 場所-コテージ-P1と場所、コテージ => P1)
  • 位置コテージ-MY-領域-R01 $ path_ =>配列(タイプ=>コテージ、地域=> R01)
  • 位置コテージ-MY-部門D01とを有します$ path_ =>配列(型=>コテージ、部=> d 01)
  • 場所-コテージ私-部門-D01-P1 $ path_ =>配列(タイプ=>コテージ、部門=> D01、ページ=> P1)

私がしたいと 1つの正規表現でこれを行うが、私はこれにしようと、これを行うには知らない:

$expression = '#location-(?P<type>cottage|house)[a-z,-]*'; 
$expression.= '(?P<region>r[0-9]{2}|)'; 
$expression.= '(?P<department>d[0-9]{2}\)'; 
$expression.= '(?P<town>v[0-9]{5}|)'; 
$expression.= '[-]*(?P<page>[p0-9]*)$#'; 
preg_match($expression, $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $path_); 

誰かが私を助けることができますか?

第二部では、それが可能だ場合、私はこのように、1つだけではなく、P1、唯一の01としませD01を維持したいと思います:

  • 場所-コテージ私-部門-D01-P1 $と path_ =>配列(タイプ=>コテージ、部門=> 01、ページ=> 1)の代わりに使用すると、文字列を解析することができます(ほとんどのシナリオではかなり大きめです)正規表現の
+0

実際のURLの例はありますか? – Sylverdrag

+0

どの「要素」をキャプチャしたいのですか? – FailedDev

+0

これで、一部の部品をオプションにしたいと思っていますか? ( '?'を使用) – mario

答えて

3

まず、#xを使用して正規表現をより読みやすくします。あなたは、その後、例えばd取り込むという名前のキャプチャグループの外に移動して、代わりに(?: )?でそれをラップしたくない場合は

$expression = <<< RX 
    # 
     location-(?P<type>cottage|house)[a-z,-]* 
     (?P<region> r[0-9]{2}|) ? 
     (?P<department> d[0-9]{2}) ? 
     (?P<town> v[0-9]{5}|) ? 
     [-]*(?P<page> [p0-9]*) ? 
    $#x 
RX; 

そして:次にオプションすることができ、各キャプチャグループの後ろ?を使用しています。

+0

ありがとうございました。あなたは私にエスケープするための例を教えていただけますか? – newbee

+0

あなたのケースでは、 '(?:[d](?P [0-9] {2}))?'となります。 ( '[d]'は外見のためにcharクラスにラップされています。) – mario

+0

ありがとう! – newbee

2

list($locationString, $type, $region, $department, $town, $page) = array_pad(explode('-', $path(), null, -6); 

ここで、すべてのパラメータを独自に検証します(欠落しているパラメータはnullなので、array_pad()です)。これ以上の読み込みはできませんが、後から簡単に変更できます。たとえば、型を追加する場合などです。

+0

私はpreg_matchを継承しているので、私はexplodeを使いたくないので、この問題を解決したい。 – newbee

+0

翻訳:私はこの複雑な正規表現を動作させるために何時間も働いていましたが、今はあきらめるつもりはありません...';)' –

+0

申し訳ありませんが、あなたは間違った方向を何時間も見ていたようです。できるだけ複雑なソリューションを作っているのですが、それは解決策ではありません。 – KingCrunch

関連する問題