0

を使用してphpファイルの定数を再定義するために使用される正規表現がありpreg_match、入力ファイルはhtmlspecialcharsを使用してスクリーニングされます。

define('MEMBERSHIP', 'GOLD'); 

次の正規表現が機能します

/define.*[&quote\']' . $constant . '[&quote;\'].*;/i

ただし、最後のセミコロンに一致し、ほとんどのシナリオで機能しますが、次のような場合に失敗します。

define("MEMBERSHIP", 'GOLD'); // membership subscription; empty means not in use.

最後のセミコロンに注意してください。コードは次のように置き換えられます。

define("MEMBERSHIP", 'SILVER'); empty means not in use.

これはコードを壊します。以下の正規表現を試しましたが、二重引用符がある場合は機能しませんでした

/define.*[&quote;\']' . $constant . '[&quote;\'][^;]*;/i

これを修正する方法はありますか?

4

2 に答える 2

1

?の後に a を追加する*と、貪欲になり、文字数が最小限になります。だから試してみてください

/define.*?[&quote\']' . $constant . '[&quote;\'].*?;/i

それがあなたが望むことをするかどうかを確認します。

一般的に言えば、実際に文字.を意味しない場合は、 s の使用を避ける必要があります。

于 2012-12-11T11:54:04.457 に答える
0

後方参照を使用して、対応する引用符を一致させることができます。

'/define[^"\']*(["\'])' . $constant . '\1[^;]*;/i'

それ以外の場合は、最後にある否定された文字クラスが間違いなく道です。

于 2012-12-11T12:04:28.760 に答える