2012-09-28 24 views
0

我試圖讓字符串在報價中。 我正在使用正則表達式,但我有轉義引號的問題。獲取並用正則表達式替換帶引號的字符串

例如,我有這個:

$var = "SELECT * FROM TABLE WHERE USERNAME='Carasuman'"; 
preg_match_all('~([\'"])(.*?)\1~s', $var, $result); 
$new = preg_replace('~([\'"])(.*?)\1~s',"<#################>",$var); 

代碼工作完美。我在$新報值替換值$結果[1]

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>"; 
$result[1] = "Carasuman"; 

我的問題是,當我加引號之內的scaped報價:

$var = "SELECT * FROM TABLE WHERE USERNAME='Carasuman\'s'"; 

我得到這個:

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>'s"; 
$result[1] = "Carasuman\" //must be "Carasuman\'s"; 

我怎樣才能避免這種錯誤,並得到$新的$結果[1]像第一個例子?:

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>"; 
$result[1] = "Carasuman\'s"; 

謝謝!

+0

檢查出正面/負面lookbehind並忽略「\」「 - http://www.regular-expressions.info/lookaround.html – Lachezar

回答

1

的比賽,你永遠不會來獲得Carasuman的沒有\作爲單個匹配元素,因爲您可以在單個匹配內匹配跳過字符。它要麼會搶CarasumanCarasuman \的

只是使用str_replace函數擺脫反斜槓

preg_match_all('~([\'"])(.*)\1~s', $var, $result); 
$result[2] = str_replace('\\','',$result[2]); 

爲取代的?在(。*?)組中使其不合格,意味着它將在第一場比賽中停止。去除 ?在(。*?),使其貪婪的,這意味着它會繼續下去,直到最後一場比賽

preg_replace('~([\'"])(.*)\1~s',"<#################>",$var); 

編輯

而不是在比賽上$結果後做str_replace函數[2],它可能會更好,只是事先做一樣的初始字符串:

$var = str_replace("\\'","'",$var); 
preg_match_all('~([\'"])(.*)\1~s', $var, $result); 
$new = preg_replace('~([\'"])(.*)\1~s',"<#################>",$var); 

您仍然需要讓你的通配符匹配貪婪的喜歡,纔能有在名稱中的撇號(*?)(*)。包括在比賽/替換,而不是國家ted作爲終止單引號

+0

不錯,謝謝webchemist! – Carasuman

0

你爲什麼不這樣做:

$var = "SELECT * FROM TABLE WHERE USERNAME='" . mysql_real_escape_string($input) . "'"; 

我不認爲你一定需要做的正則表達式。此外,mysql_real_escape_string正確逃脫你的輸入,所以你可以有$input = 'Carasuman\'s';$input = "Carasuman's";

+0

我用一個SQL語句的例子來使它更可見。不一定是一個SQL語句。 – Carasuman

0

要匹配引號中的字符串,你可以使用正則表達式'\'.*?(?:\\\\.[^\\\\\']*)*\''和四個雙引號中的字符串'".*?(?:\\\\.[^\\\\"]*)*"'