Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何分析搜索表达式并检索值?_Php_Mysql_Sql_Regex - Fatal编程技术网

PHP:如何分析搜索表达式并检索值?

PHP:如何分析搜索表达式并检索值?,php,mysql,sql,regex,Php,Mysql,Sql,Regex,我正在尝试建立一个搜索系统并检索匹配的记录。在这种情况下。。我想让用户使用一些特殊的字符来准确地构建他们的请求。所以我把这些符号,然后把它们转换成正确的SQL: +应转换为ro和 /应转换为ro或 “应转换为ro(或) 例如,当用户输入时:“书/笔”+纸 应将其转换为SQL WHERE子句: ((myfield类似于“%book%”)或(myfield类似于“%pen%”)和(myfield类似于“%paper%”) 我用一个开关盒和数组实现了这一点。但是我想还有另一种快速的方法(比如regEx


我正在尝试建立一个搜索系统并检索匹配的记录。在这种情况下。。我想让用户使用一些特殊的字符来准确地构建他们的请求。所以我把这些符号,然后把它们转换成正确的SQL:
+应转换为ro
/应转换为ro
应转换为ro
例如,当用户输入时:“书/笔”+纸 应将其转换为SQL WHERE子句:
((myfield类似于“%book%”)或(myfield类似于“%pen%”)和(myfield类似于“%paper%”)
我用一个开关盒和数组实现了这一点。但是我想还有另一种快速的方法(比如regEx)。你有解决这个问题的想法吗?

注意1:我应该从这个表达式中收集所有术语,并将它们保存在另一个表中。因此,我需要将它们收集到一个数组中。
注2:术语可以用世界上所有语言书写!从英语到阿拉伯语、波斯语……可能是中文!!!!

谢谢

考虑到您的示例“书/笔”+纸张,以下步骤应该可行

    $sourceQuery = '"book/pen"+paper';
    $targetQuery = preg_replace(
                   '/^"(.*)[//](.*)"[/+](.*)$/',
                   '( (myfield LIKE "%$1%") OR (myfield LIKE "%$2%") ) AND ( myfield LIKE "%$3%")',
                   $sourceQuery);
要在源查询中的一个位置匹配多个运算符,请使用[\\;+] 阅读有关匹配您希望使用的任何类型的模式的内容

对于语言问题,您在使用非英语语言时是否遇到过任何问题。

尝试一下:

$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%')

和之间的区别是什么?引号表示括号,将覆盖表达式中运算符的定义优先级,但斜杠表示或SQL语法中的运算符。thx emaillenin..但我应该找到一种方法,可以在所有搜索表达式中回答,而不仅仅是此示例。太棒了。。。我测试它!适用于所有语言。但是由于注释1,有没有办法将所有“/”转换成像“然后分解字符串来检索所有单词”这样的字符?(例如“book/pen”+纸张转换成“book/pen/paper”)(例如“red sky/sunset”->“red sky/sunset”)thnx…我通过混合您的伟大方式和preg#u replace#callback()解决了这个问题检索每个术语并对其进行操作!您是最棒的:)