我正在尝试构建一个搜索系统并检索匹配的记录。在这种情况下..我想让用户使用一些特殊的字符来准确地建立他们的请求。所以我把这些标志,然后将它们转换为正确的SQL:
+ 应转换为 AND
/ 应转换为 OR
“应转换为(或)
例如,当用户输入时:“book / pen”+ paper
它应该转换为SQL WHERE子句:
((myfield LIKE“%book%”)或(myfield LIKE“%pen%”))AND(myfield LIKE“%paper%”)
我用开关盒和数组实现了这个..但我想还有另一种快速的方法(例如regEx)。你有什么想法解决它吗?
注意1:我应该从此表达式中收集所有术语并将其保存在另一个表中。所以,我需要将它们收集在一个数组中
注2:条款可以使用所有世界语言编写!从英语到阿拉伯语,波斯语,...可能是中国人!!!!
感谢
答案 0 :(得分:1)
尝试使用:
$str = '"book/pen"+paper';
// First: replace all keywords (assuming they don't contain " / + by SQL LIKE
$str = preg_replace('#([^"/+]+)#', "(myfield LIKE '%$1%')", $str);
// then replace / by OR
$str = preg_replace("#/#", " OR ", $str);
// then replace + by AND
$str = preg_replace("#\+#", " AND ", $str);
// and finaly replace pair of "" by ()
$str = preg_replace('/"([^"]+)"/', "($1)", $str);
echo $str,"\n";
<强>输出:强>
((myfield LIKE '%book%') OR (myfield LIKE '%pen%')) AND (myfield LIKE '%paper%')
答案 1 :(得分:0)
考虑到您的示例“书/笔”+纸张,以下步骤应该有效。
$sourceQuery = '"book/pen"+paper';
$targetQuery = preg_replace(
'/^"(.*)[//](.*)"[/+](.*)$/',
'( (myfield LIKE "%$1%") OR (myfield LIKE "%$2%") ) AND ( myfield LIKE "%$3%")',
$sourceQuery);
要匹配源查询中某个位置的多个运算符,请使用[\ | +]等模式范围 阅读preg_replace以匹配您希望使用的任何类型的模式。
对于语言问题,请在使用非英语时遇到任何问题。