2016-08-29 6 views
0

PHPの変数は一致させる必要がありますが、一重引用符ではなく、$がエスケープされていない場合はメソッド呼び出しと一致する必要があります。phpの変数を一致させるにはどうすればいいですか?

さは一致する必要があります:

$foo 
"$bar" 

ではなく、このように使用:

$foo->bar 
'foo $bar baz' 
"\$foo" 

これまでのところ、私はこの正規表現を持っている:メソッド呼び出しを一致してdemo

dolarエスケープしていない "/(?<!\\\\)\$(\w*+(?!->))/"
+1

PHPを解析する必要がありますか?正規表現を求めるあなたは引用符/コメント、および物を隠すことができるものを除外しなければならないでしょう。私は、$が引用/コメントの外でどのようにエスケープできるかを見ていませんか? – sln

+0

また、何かがエスケープされていないことを確認するには、(?<!\\)(?:\\\\)* something'_と何かがエスケープされているかどうか '(?<!\\)(?:\\\\\ )* \\ something'_ – sln

答えて

1

この正規表現は、PCREで動詞(*SKIP)(*FAIL)

を使用して使用できます
'[^'\\]*(?:\\.[^'\\]*)*'(*SKIP)(*F)|(?<!\\)\$([a-zA-Z_]\w*)\b(?!->) 

正規表現の分裂:

'[^'\\]*(?:\\.[^'\\]*)*' # will match text between single quotes skipping escaped quotes 
(*SKIP)(*F)    # skips above single quoted text 
(?<!\\)     # negative lookbehind to fail the match is $ is preceded by \ 
[a-zA-Z_]\w*    # will match a variable starting with $, \b is for word boundary 
(?!->)     # negative lookahead to fail the match if -> is at next position 

RegEx Demo

+0

エスケープされた引用符 '' $ foo \ '$ bar \' ''はどうですか? – revo

+0

しかし、彼は一重引用符の間ではないと言った。彼はしなかった?私はそれがますます複雑になると思う。 – revo

+0

良いしかし、そのような変数「$ 999」もありません。それはドル署名額とみなされ、無視されるべきです。 – revo

関連する問題