2014-05-07 68 views
1

我想通過preg_match驗證查詢。我想要替換所有%s,%d和%f,但不要使用\%s,\%d和\%f。我的正則表達式是:如何不匹配只有一個正則表達式

$query = "UPDATE FROM lol SET lol = \%s, asd = %s WHERE lol = %d"; 
$reg = preg_match("(\%s|\%d|\%f)(?!\\\%s|\\\%d|\\\%f)", $query, $matches); 
var_dump($matches); // %s and %d, because \%s can't be matched 

我想不會\%的比賽,因爲如果你做這樣的事情: 「其中,ST LIKE%S」(以S開始),它會崩潰。然後我想用一個正則表達式來驗證它,並在替換之後刪除斜槓。我將使用匹配%s,%d和%f來替換它,如str,int和float,所以我只想使用一個正則表達式。你可以幫我嗎?

回答

1

Zerquix,這是我能想到的最緊湊的正則表達式。它只匹配正確的。

$regex = "~\\\\%(*SKIP)(*F)|%[sdf]~"; 
$string = "match %s, %d and %f but NOT with \%s, \%d and \%f."; 
if(preg_match_all($regex,$string,$m)) print_r($m); 

live demo

+0

它的工作原理,因爲我想,感謝您! :) – Zerquix18

+0

@ Zerquix18很高興。 – zx81

2
(?<!\\)(%s|%d|%f) 

沒有測試PHP壽...因爲在PHP中的正則表達式是字符串,你需要額外逃脫每兩個反斜槓,所以你應該有他們四個人在你的PHP字符串。有兩個級別的轉義需要考慮,PHP字符串和正則表達式。

編輯:測試:

echo preg_replace("/(?<!\\\\)(%s|%d|%f)/", "replaced", "%s \\%s X%d")."\n"; 
// => replaced \%s Xreplaced 

你的代碼查找%S,%d,%F 後面沒有%S,%d或%F(無反斜槓因爲字符串逸出條之一,因爲%不需要轉義,所以就而言,就\%s等而言,相當於%s。我的代碼尋找%s,%d,%f 之前沒有\

EDIT2:你的情況下,

$query = "UPDATE FROM lol SET lol = \%s, asd = %s WHERE lol = %d"; 
$reg = preg_replace_callback("/(?<!\\\\)(%s|%d|%f)/", function($m) { 
    $repl = Array("%d" => "int", "%s" => "str", "%f" => "float"); 
    return $repl[$m[1]]; 
    }, $query); 
echo $reg."\n"; 
// => UPDATE FROM lol SET lol = \%s, asd = str WHERE lol = int 

然而,看着你在做什麼,你可能是明智的使用ADODB或綁定參數類似的東西,而不是一個自制的解決方案。

相關問題