2017-08-15 8 views
2

私の現在のパターンはこれです:彼らは$ 1、$ 2、$ 3であるが、私はいくつかの更なる柔軟性を許可するように三つの部分を交換しなければならないPHP正規表現はかっこを使用せずに1つの単語に一致しますか?

preg_replace($pattern, '$1*$2*$3', $result); 

pattern=("/(.*)(\bIf you want\b)(.*)/iu"); 

しかし、と

:だから私は単にこれを行うことができます

If you want 
If I want 

:私は、たとえばこれらの行の両方を検出することができます

pattern=("/(.*)(\bIf (I|you) want\b)(.*)/iu"); 

しかし、$ 1、$ 2、$ 3を置き換える必要があるため、問題が発生します。しかし、他のパターンがあることも、単に「何が次に起こった」|「したい場合(私はあなたが)」

$pattern = "/(.*)(\b".$value."\b)(.*)/iu"; 

は$値は時々、上記の例のように修飾子を持っている:パターンを動的に挿入され、したがって、すべて異なっているされています修飾子なし。余分な角括弧は問題を引き起こしますが、私はそれを行う別の方法を見つけることができません。

EDIT:ここでの問題は$ 1、$ 2、$ 3のpreg_replaceです。

"/(.*)(\bwhat happened next\b)(.*)/iu" 

のようなパターンでは、これは罰金を通過するが、

"/(.*)(\bIf (I|you) want\b)(.*)/iu" 

とのような追加のブラケットでそれは$ 1、$ 2、$ 3にpreg_replaceで適切に代わるものではありません。

また、私はそれがこの

If you want|If I want 

しかし、その特に説得力のないように行うことができます実現します!

+1

あなたは '$ value'にユーザ定義パターンを含めることができますか? \ {\ f2}(。*)/ iu "' –

+0

あなたが何を意味するのかよく分かりません。この問題はpreg_replaceにあり、$ 1、$ 2、$ 3の3つの括弧で囲まれたクエリが置き換えられます。 *別のブラケットを追加すると、明らかに正しく動作しません。だからこそブラケットを使わずにこのことを行う必要があるのです。そうでなければ何か別の方法が必要です。 – Hasen

+0

文字列の先頭から部分文字列を取得し、その後に一致文字列を取得し、その後に文字列を取得したいとしますか?あなたは文字列に1つのマッチを期待していますか? –

答えて

-3

これを試してみてください:

pattern=("/(.*)(\bIf [I|you]+ want\b)(.*)/iu"); 
+2

私はすでにそれを試みましたが、角括弧はそのようには動作しません。それを試してください、それは動作しません:regex101.com – Hasen

+0

申し訳ありません更新された答えを参照してください。 http://regexr.comで動作します。私は '+'を見逃しました。 – DrRoach

+0

@Hasen '+'で動作しますか? – DrRoach

-1

ちょうどあなたを私に一致するかについては、これは私の仕事:

$pattern=("/(.*)(\bIf (?:i|you) want\b)(.*)/iu"); 
+0

私は人々があまりにも迅速に答えていると思います。私の質問の全体的なポイントは大括弧なしです。それができるかどうかはわかりませんが、私の質問にはすでにここにあなたのソリューションが掲載されています....私は明らかにこれを行う方法を知っていますが、余分な角括弧を追加することはまず問題を引き起こします。 – Hasen

+1

これは普通の括弧ではありません。 '?:i'のユーザには注意してください。これはこのブラケットを '非捕捉ブラケットグループ'にします –

0

をあなたが持っている問題は、キャプチャグループなどに頼ることができないということですそれらの数は、ユーザ定義パターン部分が任意の数の番号付けされた捕捉グループを含むことができるので、変化し得る。

という名前のグループを使用することで回避できます。それらの唯一の問題は、PHPが置換パターンで指定された後方参照をサポートしていないことです。 preg_replace_callback機能を使用して回避することができます。

$s = 'text If you want this'; 
echo preg_replace_callback("/(?<start>.*)(?<mid>If (I|you) want)(?<end>.*)/siu", function($m) { 
    return $m['start'].'*'.$m['mid'].'*'.$m['end']; 
}, $s); 
// => text *If you want* this 

PHP demoを参照してください。

ユーザー定義のパターンと競合しないように、グループ名を「難読化する」ことができます。また、パターン内で使用できない名前をユーザーに知らせることもできます。

注記s修飾子は、改行改行も.にします。

最初startパターンは貪欲ドットパターンであるように上記溶液をmidグループの最後発生に一致します。文字列に複数の一致が含まれていて、midグループを文字列の最初の一致と一致させる場合は、(?<start>.*)(?<start>.*?)に置き換えます。そうでなければ、アルゴリズムがどのようなものであるべきかを決める必要があります。

関連する問題