2017-11-23 7 views
-1

私は自分のルートクラスを作成しようとしています。有効なURLを解析することに熱い問題があります。preg_match-regexpでURLを解析する

これは、URLの例です: http://localhost/app/module/command/i15

そして私は、アレイは、PHPでするpreg_matchを使用して作成する際に、追加要素であると/スラッシュの後にすべての要素が必要です。

数字の検索には、([0-9] +) 文字が含まれている文字列の検索 - または_([^。] +)(ここに問題がありますこのような)

正規表現全体ルックス:それはより多くの美しさになります

0 => app, 1=> module, 2 => command, 3 => i15 

するpreg_matchはトンのようなだけで何かが返されます場合:私は5つの要素、そのようなことの配列が欲しい

(app)\/(module)\/([^.]+)\/i([0-9]+) 

帽子:(パラメータ識別子としてIなし)

0 => app, 1=> module, 2 => command, 3 => 15

は、誰もが速いこれで私を助けることができますか?私はそれで2日間立ち往生し、正しい解決策を見つけることができません。

EDIT:

/app/contacts/list => (app)\/(contacts)\/([^.]+) 
/app/contacts/edit/i15 => (app)\/(contacts)\/([^.]+)\/i([\d]+) 
/app/contacts/view/i15-c2 => (app)\/(contacts)\/([^.]+)\/i([\d]+)-c([\d]+) 

そして、私は上記のようなさまざまな正規表現を作成し、それらのすべてのために:私は次のように定義済みのいくつかの正規表現を持っている 。問題の星私は間に何か解析する必要がある場合:

/app/contacts/preview/random-name/i15-c2 

または

/app/contacts/preview/random-name-i15-c2 

([^。] +)もキャッチ\(スラッシュ) - 上記の最初の例では、このスラッシュは正規表現全体を壊しました: - (

EDIT SECOND TIME

:-)私はいくつかのパスのためのいくつかの定義済みの正規表現を持っています。

私はパスでURLを入力した場合:私は、私が欲しいものを知っているが、PHPはそう選択どのユーザー知らない - 私は現在のURLをチェックして、最良の結果と一致し

$regexp = [ 
    [0 => '(app)\/([^/]+)'], 
    [1 => '(app)\/([^/]+)\/i([0-9]+)'] 
]; 

次へ:顔をしていることができます:

アプリ/ユーザー名/ I15

システムは私にその$の正規表現を示し[0]最高の結果である - $の正規表現は、[1]最高ですので、それは、真実ではないものを。

これは私の問題を説明してくれることを願っています。

+0

[PHPでHTML/XMLをどのように解析して処理するのですか?](https://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in) -php) – Nic3500

+0

ええ、自分のルートクラスを作ってはいけません。ちょうどnikic/fastrouteを使用してください。 – Gordon

+0

@Gordon私のアプリケーションは他のMVC(ルート>コントローラ)と似ていないので、これは役に立ちません。私のルートは特別なパラメータを持つファイルにリダイレクトされます。 EDIT:find half solution [^ /] + 多分私はあなたのすべての問題をあなたに見せようとしています。 –

答えて

0

グループを使用して正規表現でキャプチャするので、それらを使用して目的の配列を作成できます。グループを格納するpreg_match()に変数を渡す:

$components = []; 
preg_match('#(app)/(module)/([^.]+)/i([0-9]+)#', $uri, $components); 

すぐ$componentsの最初の要素は、次に全体の一致、およびグループです。私のルーティングのための

array_shift($components); # discard first element 
+0

ありがとう - 私はこれを持っていますが、ルーティングで私は他のパスもチェックしています - もしパスが定義されていれば:app/module/list - これはうまくいきません - ve集計リスト/ i15 –

+0

正規表現を適切に修正する必要があります。あるいは、全く違う戦略をとってみましょう: '/'にuriを分割し、それぞれのコンポーネントを別々に分析します。私は非常に単純なカスタムルーターのシナリオでこれを使用しました。それより複雑なものについては、大きなルータがどのように動作するのかを調べるか、[nikic/FastRoute](https://github.com/nikic/FastRoute)のようにあなたのプロジェクトでそれを使うだけです。 – sidyll

+0

私は、 [^ /] + - しかし、私が試合のパーセンテージを計算すると、このショーは正しい正規表現ではありません。 –

0

[OK]をHERESにクラス: https://gist.github.com/djmassive/d7487cef92e3adb1abf7ca31d3e96a53

全体マジック)(メソッドの解析に

をやっている私は、ルーティングを追加しました:

$route->get('(app)\/:string', [ 'schema' => '2', 'module' => 'system', 'file' => 'profile' ]); 
$route->get('(app)\/:string\/i:id', [ 'schema' => '2,3', 'module' => 'system', 'file' => 'profile', 'command' => 'view' ]); 
  • スキーマを定義します私は何をしたいのですか?int、string、arrayのいずれかです。
  • モジュールは
  • ファイルは、ファイル名
  • コマンドでフォルダ名である私は、URLがあった場合のショーのために、ファイル内のコマンドの使用は、私が

欲しいものを直接です: アプリ/リスト - システムは、そのようにそれを読み取ります。 $コマンドがリストである(スキーマが第二の要素を示す) -

アプリケーション/ユーザ名/ I15 $コマンドがビュー $ idは[ユーザ名]、[15]

であるべきであるべきである動作しますこの場合

、最初の正規表現は、第1のように試合の66%を示している - しかし、もう一つは

は、デバッグのを見てください100%でなければなりません:

我々が見る
Checking regexp: #(app)\/([^/]+)# - to match path: app/username/i15 
Results preg_match \$matches array: 
Array ([0] => app/username [1] => app [2] => username) 
Percentage match: 66.6666666667% 

Checking regexp: #(app)\/([^/]+)\/i([\d]+)# - to match path: app/username/i15 
Results preg_match \$matches array: 
Array ([0] => app/username/i15 [1] => app [2] => username [3] => 15) 
Percentage match: 66.6666666667% 

、最初の正規表現であることを三番目の要素がないのでうまくいかない。

私が知っていることから、全体的な問題は主に完全な条件を満たすものを返さないことです。