2012-02-13 21 views
0

私はこれを自分自身で理解しようとしてきましたが、私は正規表現が私のものではないことを恐れています。このサンプル文字列では、"私の名前は%nameで、私は$ addressに住んでいます。""%"で始まる単語を得ようとすると、正規表現で見つかった単語に応じて$nameまたは$addressの値に置き換えようとしています。新しい文字列は、置き換えられた値で完全に返されます。これはPHPであると\%の(%がエスケープされている)単語正規表現:最初に '%'を含む単語を検索する

(%は最初の文字ではありません)のaaa%のAAA

は次のように言葉を返すべきではありません。* .iniファイルからすべてのデータを取得しているので、私はこれを使用しています。私は$ _POSTの例を削除して誤解を招かないようにします。

+1

-

(?<!\\)(?:\\.)*(?<![%\w])%(\w+)

拡大しました。タグセットには、使用しているプログラミング言語やライブラリが含まれていません。あなたの質問は、書かれたように答えることはできません。 – tchrist

+0

私はPHPを想定していますが、これにマッチするために正規表現を使用する必要があるのはなぜですか?私がこの権利を読んでいるなら、単純な文字列の連結はもっと簡単だと思います。あなたの質問を明確にしてください。 – Hersha

+0

+1、なぜ負の投票-2? –

答えて

0

この1つは罰金を行う必要があります。

(?<!\\|\w)%\w+ 

を、それは通常、ディスプレイの前に$ _POST/$ _ GETを/何でもサニタイズないのは悪いことだが。あなたが使用することができjavascriptや類似のREGEXエンジンで

+0

あなたの答えはとてもエレガントです!これは完全に機能します。 – enchance

+0

これは実際にエスケープされたエスケープされたエスケープを許可していません。 '\\%test'は渡されず、' %% test'は成功します。しかし、それはOPで大丈夫かもしれません。 – sln

+0

ああ、そうです。これは、\\%testまたは%% testをまったく許可しません。 – enchance

0

\B(%\w+)\b 

編集:\wが必要なすべての文字にマッチし、任意の非単語で停止しますので、
この場合、最終的\bは、オプションであります@ tchristが指摘しているようにchar。

編集2:これは\%nameと一致しません。このような

(?:^|\s)(%\w+) 
+0

最終的な '\ b'は世界で何ですか? – tchrist

+0

ワード境界。この場合、マルチワード仕様のためオプションです。指摘してくれてありがとう。私は私の答えに編集を追加します。 – rcdmk

-1

何かが参考になります。

$string = "Hello %name from %city "; 

$name = "Joe"; 
$city = "Boston"; 
$array = array(); 


preg_match("/%\w+/",$string,$array); 

foreach($array as $string1) 
       echo "match: ".$string1; 
+1

これは '\%please \%do not \%switch \%this 'を正しく処理しません。 – CanSpice

+1

これは 'anythingHere%anyOtherThing'と一致します。 – rcdmk

+0

それは完全なものではありません。あなたはコメントが正しい –

0

これはおそらく動作するようです。この整列はエスケープさえします。 - あなたは "単語" を定義していない

(?<!\\)  # Not an escape behind us 
(?:\\.)* # 0 or many esc plus anything 
(?<![%\w]) # not % nor \w behind us 
%(\w+)  # % then capture grp1 bunch of word chars 
関連する問題