2014-08-30 80 views
0

我試圖從插入語句中粘貼一些工作,並將它們格式化爲mysqli預準備語句。記事本+正則表達式問題

下面是一個例子:

INSERT INTO 
products 
(hash, name, description, large_img, small_img, label_img, category, small, large, small_price, large_price, best_seller, in_stock) 
VALUES 
([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10],[value-11],[value-12],[value-13]) 

所以我嘗試正則表達式:但

find: (\[.*)(]) 


replace: ? 

,而不是替換每個[value=*],它取代所有的人只在一個閉合支架的最後一個實例停止。爲什麼?

輸出:

INSERT INTO 
products 
(id, hash, name, description, large_img, small_img, label_img, category, small, large, small_price, large_price, best_seller, in_stock) 
VALUES 
(?) 

我怎樣才能得到它來取代它的權利。我的正則表達式不應該選擇所有東西,直到第一個右括號爲止,但是爲什麼它會選擇所有內容直到最後一個右括號?

回答

2

*greedy運營商意味着它會匹配儘可能多的,因爲它可以和仍然允許正則表達式的其餘部分匹配。使用*?表示「零或多個 - 優選儘可能少」的非貪婪匹配。

(\[.*?)(]) 

注意:實在是沒有必要使用捕獲組,因爲你不是在你更換電話引用它們。

Find: \[.*?\] 
Replace: ? 
1

不要忘記*是貪婪的,它試圖matche儘可能使用非貪婪版本而不是:

(\[.*?)(]) 
1

正如其他人所說,*是貪婪,而*?是不貪婪,只會拿起最低金額相匹配(這是你想要做的事。)


但是,不是爲PHP組合一串問號和逗號,而是讓PHP自己生成它們:implode(',', array_fill(0, 13, '?'))

請輸入您需要的許多信息以代替13,並且您擁有一套可靠的佔位符,不會受到雙眼錯字的困擾。

例子:

$placeholders = implode(',', array_fill(0, 13, '?')); 

$sql = <<<SQL 
INSERT INTO 
products 
(id, hash, name, description, large_img, small_img, label_img, category, small, large, small_price, large_price, best_seller, in_stock) 
VALUES 
($placeholders) 
SQL; 

echo $sql

INSERT INTO 
products 
(id, hash, name, description, large_img, small_img, label_img, category, small, large, small_price, large_price, best_seller, in_stock) 
VALUES 
(?,?,?,?,?,?,?,?,?,?,?,?,?) 
+0

你可以這樣做'$瓦爾=「(ID,哈希,名稱...等) '然後用'1 + countTheCommasIn($ vars)'替換implode中的'13'?同時將'products $ vars VALUES'放入SQL中 – AdrianHHH 2014-08-30 07:37:41

+0

我不知道PHP,但是認爲你可以通過計算逗號而不是寫一個'13'來改進你的答案。您的評論顯示另一種方式。用更多選項更新你的答案可能有助於提問者和其他人。 – AdrianHHH 2014-08-30 08:00:44