2012-05-16 18 views
3

我需要RegEx的幫助。這個概念很簡單,但實際的解決方案遠遠超出我知道如何解決的任何問題。如果任何人都可以解釋我如何達到我想要的效果(並提供任何示例代碼的解釋),這將非常感謝!MySQL - 令人困惑的RegEx變量問題


基本上,想象存儲以下字符串數據庫表:

'My name is $1. I wonder who $2 is.' 

首先,請記住,美元符號,數字格式是一成不變的。這不僅僅是爲了這個例子 - 這就是實際存儲這些通配符的方式。我希望像下面這樣的輸入能夠返回上面的字符串。

'My name is John. I wonder who Sarah is.' 

我該如何創建一個查詢,以這種格式搜索通配符,然後返回適用的行?我想象一個正則表達式是最好的方式。請記住,從理論上講,任何數量的通配符都應該是可以接受的。

現在,這是我現有查詢的一部分,它將內容拖出數據庫。連接等等,因爲在單個數據庫單元中,有多個字符串由豎線連接起來。

AND CONCAT('|', content, '|') 
    LIKE CONCAT('%|', '" . mysql_real_escape_string($in) . "', '|%') 

我需要修改^此行是與作爲查詢的一部分變量工作,同時保持到位當前效果(豎線等)。如果RegEx也考慮了條形圖,那麼可以刪除CONCAT()函數。

下面是一個例子字符串拼接,因爲它可能會出現在數據庫:

Hello, my name is $1.|Hello, I'm $1.|$1 is my name! 

查詢應該能夠匹配任何字符串中的塊,然後返回該行是否有一場比賽。變量$1應被視爲通配符。垂直條總是會分隔塊。

+0

如果每個獨立的字符串只有一個模式,你爲什麼不只是添加一種模式索引列,使搜索更容易?那麼你可以一起加入字符串和模式,並在PHP端創建正則表達式匹配? –

回答

2

對於MySQL,this article是一個很好的指導,它應該可以幫助你。正則表達式將是「(\ $)(\ d +)」。這裏有一個查詢我扯下的文章:

SELECT * FROM posts WHERE content REGEXP '(\\$)(\\d+)'; 

獲取數據後,使用這個方便的功能:

function ParseData($query,$data) { 
    $matches=array(); 
    while(preg_match("/(\\$)(\\d+)/",$query,$matches)) { 
     if (array_key_exists(substr($matches[0],1),$data)) 
      $query=str_replace($matches[0],"'".mysql_real_escape_string($data[substr($matches[0],1)])."'",$query); 
     else 
      $query=str_replace($matches[0],"''",$query); 
    } 
    return $query; 
} 

用法:

$query="$1 went to $2's house"; 
$data=array(
    '1' => 'Bob', 
    '2' => 'Joe' 
); 
echo ParseData($query,$data); //Returns "Bob went to Joe's house 
+0

我編輯了我的問題以更好地顯示我需要的內容。看看你的例子,我不認爲這正是我想要的。 – Nathanael

0

如果你不發粘有關使用1美元和2美元,可能會改變他們一下,你可以看看這個:

http://php.net/manual/en/function.sprintf.php

E.G.

<?php 
$num = 5; 
$location = 'tree'; 

$format = 'There are %d monkeys in the %s'; 
printf($format, $num, $location); 
?> 
0

如果你想在數據庫中找到的條目,那麼你可以使用一個LIKE語句:

SELECT statement FROM myTable WHERE statement LIKE '%$1%' 

哪個會發現,包括$ 1中的所有語句。我假設第一個要替換的數字總是1美元 - 這並不重要,在這種情況下,通配符的總數是任意的,因爲我們只是在尋找第一個數字。

PHP替換有點棘手。你也許可以這樣做:

$count = 1; 
while (strpos($statement, "$" . $count)) { 
    $statement = str_replace("$" . $count, $array[$count], $statement); 
} 

(我沒有測試過,所以有可能是有錯別字,但應足以讓一般的想法。)

的一個缺點是如果要替換字符串中的十個以上參數,它將失敗 - 第一個runthrough將替換$ 10的前兩個字符,因爲它要查找$ 1。