2011-08-15 19 views
2

正規表現から文字列を作成しようとしています。私はKohanaフレームワークのルーティングシステムで、正規表現に似た何かを使ってルートを設定できることに気付きました。次に、あなたが設定したルートと一致するURLを作成することができます。私は似たようなことをしようとしていますが、それを行うためのきれいな方法を見つけることができません。私は、例えば、次の正規表現持っている:私は、「アプリケーション」は「A」、「コントローラ」は「b」を等しいと等しいことを言うことができるようにしたい今正規表現から文字列を作成するPHP

/^(?<application>\w+)\/(?<controller>\w+)\/(?<method>\w+)\/(?<parameters>\w+)\/?$/ 

を、「方法」、「C」に等しいです「パラメータ」は「d」に等しい。次に、指定された値で部品を置き換える文字列を取得する必要があります。私はこれを行う良い方法を見つけることができません。私は基本的に2つの方法を考えました:1)正規表現の対応する値を指定された値に置き換えるか、2)文字列を作成してそれを "適切なもの"に簡単に変換するカスタムの "正規表現構文" "必要に応じて正規表現。 Kohanaは後者を使用していますが、どちらの方法も私にとっては非常に悪いものです。あなたはどうしますか?

編集:少し明確にしようとします。例えば、次の文字列を上記の正規表現にpreg_match(): "myApplication/myController/myMethod/myParameters"を使って渡します。これは、 "application"、 "controller"、 "method"、 "parameters"のインデックスを持つ4つのアイテムと、対応する値を含む2つのアイテムを持つ配列を返します。今私は文字列を作成する必要があります "myApplication/myController/myMethod/myParameters"正規表現のパターンでは、私は4つの項目でその配列を持っている間。 PHPを使ってどうすればいいですか?

+1

これは明確ではありません。入力文字列とそれに対応する出力文字列の例を挙げてください。 –

+0

私はPHPと正規表現に非常に精通していますが、あなたが求めているものは何も手がかりがありません。あなたの質問は私にとって意味をなさないものでした。質問を一から編集することをお勧めします。しかし誰かが知っている、おそらく他の誰かが理解する。 – Gerry

+0

@Oli Charlesworth、Gerry:理解しづらいかもしれないと私は理解しています。私はそれを自分自身で説明するのに困っていました...テキストを追加して、今はっきりしていることを願っています。 – Frog

答えて

2

それはpreg_matchは(あなたの正規表現が使用して、もちろん、あり; more hereという名前のキャプチャグループをサポートしていることを考えると非常に簡単でなければなりません。

from PHP documentation

<?php 

$str = 'foobar: 2008'; 

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches); 

/* This also works in PHP 5.2.2 (PCRE 7.0) and later, however 
* the above form is recommended for backwards compatibility */ 
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches); 

print_r($matches); 

?> 

上の例の出力は以下となります。

Array 
(
    [0] => foobar: 2008 
    [name] => foobar 
    [1] => foobar 
    [digit] => 2008 
    [2] => 2008 
) 

は、だからあなたの場合には、あなたが例えば、あなたの$matches配列を使用することができます$matches['application']


編集:さて、私は完全に質問を理解していませんでした。

正規表現を使用してという文字列を生成する際の明らかな問題は、正規表現が無限の文字列に一致する可能性があることです。例えば、の/cat\s+rat/試合すべて:

cat rat 
cat rat 
cat rat 

など

しかし、あなたの例では、何も未定義ではありません。

したがって、狭いユースケースでは、正規表現のサブセットである「安全な」または単独生成可能な言語を定義する傾向が良好です。次に、/\(\?P?<(\w+)>\)/の出現をそこにあるキャプチャグループの値に置き換えることができます。

しかし、PHPでは、キャプチャグループの値を1ステップで置換する際に変数にアクセスすることはできませんので、複数のステップでこれを行う必要があります。($matchesのループで$matchとして)'(?P<' . $match . '>)''(?<' . $match . '>)'から(より安全な方法ではあるが)$$matchの値に単純な文字列置換を行うことによって、上記のグループのすべての発生を照合し、名前付きグループを抽出します。

+0

あなたの答えをありがとう!私はそれを理解し、それはまさに私が今やっていることです。私は何をしようとしていますが、この操作を逆にすることができます: "あなたの例では" "名前"が何で、 "数字"が何であるか知っています、今私は知っている値を使って正規表現パターンに対応する文字列を作りたい。たとえば、 "name"が "test"に等しく、 "digit"が "2000"に等しいことがわかっているので、私の関数は文字列 "test:2000"を作成する必要があります。 – Frog

+0

ああ...私は見る...それは少しトリッキーです。これを反映する編集... –

+0

$ str = "$ name:$ digit" – Gerry

関連する問題