我试图在插入语句中粘贴一些工作,并为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
(?)
我怎样才能让它正确地替换它。我的正则表达式不应该选择所有内容直到第一个结束括号,但为什么它会选择所有内容直到最后一个结束括号?
答案 0 :(得分:2)
*
是greedy运算符,意味着它将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。使用*?
表示非贪婪匹配,表示“零或更多 - 最好尽可能少”。
(\[.*?)(])
注意:实际上不需要使用捕获组,因为您没有在替换呼叫中引用它们。
Find: \[.*?\]
Replace: ?
答案 1 :(得分:1)
*
是贪婪的,它会尽可能地尝试匹配,而是使用非贪婪的版本:
(\[.*?)(])
答案 2 :(得分: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
(?,?,?,?,?,?,?,?,?,?,?,?,?)