2012-12-11 109 views
0

我有被用於利用preg_match重新定義在PHP文件的常數和輸入文件是使用用htmlspecialchars 例如篩選正則表達式中的PHP代碼

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 

任何想法如何解決這方面的工作?

+0

」但它沒有工作「......當你嘗試第二種方法時究竟發生了什麼? –

+0

對不起,改變了qt,它不適用於雙引號行 – Dru

回答

0

您可以通過使用一個backreference匹配相應的報價:

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

否則,您必須在最後的否定字符類肯定是要走的路。 「

1

如果您在*之後添加?,它會變得貪婪並採用最少量的字符。所以試試

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

看看它是否做你想要的。

一般來說,如果您實際上並不意味着任何字符,您應該避免使用.