2013-07-12 34 views
2

我想接受PHP的preg_match和MySQL的LIKE運算符可以使用的格式。在Regexp和MySQL之間轉換LIKE

這樣做的原因是這些條件用於代碼的兩個不同部分,一個用於將條件與數據匹配的速度顯着更快,另一個用於將數據與條件匹配的速度顯着更快。

我想爲用戶提供給類似的能力:

'hostname' 'match' '*.core-*-??.foo.com' 

對於MySQL將使用:

'%.core-%-__.foo.com' 

爲的preg_match它會使用這樣的:

'/.*\.core-.*-..\.foo\.com$/' 

我確定有人已經想出了允許便攜式匹配這兩個系統。

另一種方法是在MySQL中使用正則表達式,但我不確定從可伸縮性的角度來看這個想法有多好。

+0

它刪除了斜槓和星號。在 - 之間應該有一個星號,它在MySQL中轉換爲%,在正則表達式中使用星號和星號。這個?在正則表達式中轉換爲斜槓和點。 – adama

+1

「*另一種方法是在MySQL中使用正則表達式,但我不確定從可伸縮性的角度來看這個想法有多好。*」 - 這絕對是要走的路,但它既不是簡單的'LIKE'模式當模式以通配符開始時,匹配可以避免表掃描(所以兩者都需要全表掃描並且不好縮放)。 – eggyal

回答

2

嘗試使用preg_escape

$str_php_input = str_replace("\\*", ".*", preg_escape($str_input)); 

$str_mysql_input = str_replace("*", "%", $str_input); 

獲得過什麼應該\轉義把握好,什麼不應該,你將有好聽的工作。