2011-01-10 7 views
3

正規表現は絶対私の弱点です。この1つは完全に困惑しています。私はかなり基本的な検索機能を構築していると私は、次のパターンに基づいて、私のユーザーの入力を変更できるようにする必要があります。preg_replaceを使用してPHPのすべてのものを置き換えます

件名:

%22first set%22 %22second set%22-drupal -wordpress 

所望の出力:

+"first set" +"second set" -drupal -wordpress 

を私は望みます私はこれまでのソリューションを少なくとも投稿したいのが普通ですが、私はもっと援助を受けることができましたが、私はこれを失いました。

何か助けていただければ幸いです。ありがとうございました。

+1

あなたのデータはURLエンコードされているようです。 [urldecode](http://php.net/manual/en/function.urldecode.php)を適用すると、 "最初のセット" "2番目のセット" -drupal-wordpress'が得られます。 '-drupal'の前に実際にスペースがあるのですか、これも挿入する必要がありますか? –

+0

私はスペースを管理することができます。 urldecodeを使用している唯一の問題は、これがSQLクエリーで実行され、二重引用符をurldecodeするだけで、それらがこのパターンにある場合のみです。 – S16

答えて

1
preg_replace('/%22((?:[^%]|%[^2]|%2[^2])*)%22/', '+"$1"', $str); 

説明:$1、この場合に、正規表現に最初()の節を参照後方参照、((?:[^%]|%[^2]|%2[^2])*)です。そして[^%]と交互の(...|...|...)は、間に%22が貪欲のためにマッチしないようにした後です。 http://en.wikipedia.org/wiki/Regular_expression#Lazy_quantificationを参照してください。

Iは、ブロックコメント(/* */)と一致するのJavaCCの例ではその技術を発見し、私はそれを説明する他のウェブページを見つけることができないので、ここでは掃除機の例である:なしで12345 12345........12345間でテキストのブロックと一致するように間の12345:/12345([^1]|1[^2]|12[^3]|123[^4]|1234[^5])*12345/

+1

あなたは揺れます。どうもありがとうございました。あなたは解決策について説明することができますか? – S16

+0

'$ 1'は正規表現の最初の'() '-sectionを参照する後方参照です。この場合、'((?)[^%] |%[^ 2] |%2 [^ 2] )*) '。そして、[[^%] 'はその間の%22がマッチしないようにします:貪欲なマッチングを防ぎ、貪欲はhttp://en.wikipedia.org/wiki/Regular_expression#Lazy_quantificationで説明されています。一方、' [^%] 'メソッドはhttp:// shinkirouで説明されています。org/blog/2010/12/tricky-regular-expression-problems /(JavaCCの例で最初に見られる) –

+0

@SHiNKiROU解答に与えられたコードの説明は、コメントではなく** itsef **にするべきです。多くの人がそれを見逃す可能性がある場所です。私は、なぜあなた自身の答えを編集しなかったのか、明確化を求められたときに、小さなコメントを代わりに使用したのだろうかと思います。 – trejder

2

あなたのデータはURLエンコードされているようです。あなたがurldecodeを適用した場合、あなたは(私はあなたが-drupalの前にスペースを持っていると仮定)

"first set" "second set" -drupal -wordpress 

を取得します。

+を追加する必要があります。あなたがurldecodeを使用できない場合は、あなただけ交換するstr_replaceを使用することができ:

$str = '"first set" "second set" -drupal -wordpress foo'; 
echo preg_replace('#(|^)(?!(?:\w+"|-|))#','\1+', $str)); 
// prints +"first set" +"second set" -drupal -wordpress +foo 

更新:繰り返しますが、私はあなたが-内部引用符ではありませんを持っていないすべての単語の前にそれらを追加する必要がありますと仮定します%22"

1

これはあなたが探しているものですか?

<?php 
    $input = "%22first set%22 %22second set%22-drupal -wordpress"; 
    $res = preg_replace("/\%22(.+?)\%22/","+\"(\\1)\" ", $input); 
    print $res; 
?> 
+0

説明:\%22は "%22"と一致します。ここでのキーは、(。+?)部分です。これは、%22の間で最短(つまり、 "ungreedy")の一致を検出します。 2番目の部分では、\ 1は(。+?)の一致した値を表します。 – phooji

関連する問題