2010-10-26 31 views

回答

9

MySQL正則表達式是'extended'POSIX變體(ERE),在PHP中作爲已棄用的ereg_函數提供。

不幸的是,PHP中沒有ereg_quote,但是PCRE的特殊字符的ERE的特殊字符的超集,反斜槓逃逸的非特殊標點符號不會傷害它,所以你可以使用preg_quote逃脫安全。

(當然,你需要參數化查詢或即報價,之後mysql_real_escape_string停止反斜槓被誤解爲MySQL的非ANSI標準的字符串字面逃逸。)

+2

輕微的警告:空控制字符。 'preg_quote'將它轉義爲'\ 000',這是MySQL無法識別的格式。但是,MySQL的正則表達式引擎無論如何都無法應對空字符,它將它們當作終結符。 – bobince 2010-10-26 23:13:32

+1

我不得不使用str_replace('?','\\?',preg_quote()),因爲preg_quote()可能產生?當它不知道特定的UTF8字符時。而且?需要在正則表達式中轉義。 – JochenJung 2014-09-20 07:41:52

+0

有問題! 'mysql_real_escape_string'會轉義反斜槓字符。此功能會導致所有反斜槓再次轉義(如果您在引用後使用'mysql_real_escape_string')! – 2017-10-07 11:19:00

1

這裏沒有原生的MySQL函數。在將正則表達式傳遞給MySQL查詢之前,您可能只需要使用preg_quote

6

可悲的是,PHP的preg_quote()弄亂了MySQL的REGEXP通過逃逸冒號符號(:)這MySQL的REGEXP不明白

+1

那麼是preg_quote最好的方法,然後用未轉義的冒號替換所有的冒號冒號? – 2014-08-21 20:13:19

1

試試這個:(PHP)

$tags="test'*\\\r blue"; 
    $tags=mysql_real_escape_string($tags); 
    $tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags); 
    $tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags); 
0

謝謝@bobince's good answer。但是,如果您需要在引用後使用mysql_real_escape_string,則說明它存在問題,我在評論中提到了它。

其實preg_quotemysql_real_escape_string有重疊,它使這個問題! mysql_real_escape_string在這種情況下不能逃脫\。因此,我建議:

function regexpEscape(/*string*/ $input) // Can uncomment `string` for PHP 7.0+ 
{ 
    return addcslashes(preg_quote($input), "\0'\"\n\r\x1A"); // charlist = All characters that escape by real_escape_string except backslash 
} 

(對於charlist見:http://php.net/manual/en/mysqli.real-escape-string.php

我知道這是不是一種理想的方式。但找不到更好的方法。