我正在尝试计算正则表达式(我很少有经验)来检查sql语句中是否存在一个字符串(“WHERE”),但前提是它在括号之间不存在。
我正在使用PHP,并希望获得代码或帮助。
我会发布我尝试过的代码,但实际上根本不知道从哪里开始。我试图使用其他方法来达到预期的效果,但仍然遇到一个或另一个问题。
我正在尝试根据一堆搜索条件构建一个SQL语句,并且在每个可能的搜索字段中,我需要确定放置“WHERE”或“&&”的天气。在sql语句之前进行比较。
我使用strstr做了一段时间,但后来不得不在sql的“SELECT”部分添加一个子查询,需要使用“WHERE”,所以这显然搞砸了我的方法。
任何提示都会很棒。
修改
声明的开头:
SELECT `t1`.*, (SELECT COUNT(`eta`.`time_away`) FROM `table2` WHERE `table2`.`field` = '1') as `time_away`
FROM `table1` `t1`
LEFT JOIN `table3` `t3` ON `t1`.`id` = `t3`.`t3id`
然后我有各种条件会添加一个WHERE语句,例如:
if ($this === true) {
### CHECK HERE TO SEE IF WHERE EXISTS, BUT NOT THE WHERE WITHIN THE SUBQUERY
if ($sql does not contain WHERE outside of subqueries) {
$sql .= " WHERE ";
} else {
$sql .= " && ";
}
$sql .= ""; // add my condition here
}
这显然只对一种情况有所影响,但是我的脚本会有很多,而在第一种情况之后,这将是非常必要的。
答案 0 :(得分:2)
删除()中的所有内容,并在sql命令的剩余部分中搜索WHERE子句:
<?php
$string = 'select * from (select * from a where a.id=x) where id=y';
$pattern = '/\(.*\)/';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);
?>
将打印:
select * from where id=y
现在你可以做正常的'搜索'了。
答案 1 :(得分:1)
您可以尝试此测试:
if (preg_match('~(?>(?>[^()w]++|\Bw++|\bw+(?!here\b))+|(\((?>[^()]++|(?-1))*\)))*\bwhere\b~i',
$string, $match)) {
/* what you have to do */
}
这个解决方案的优点是它可以处理嵌套的括号,并避免错过某些内容,当其他方法失败时,例如:
xxxxxxxxxxxxx (sdfs(df df)g df) WHERE (sdfsdfdsfsdfsdf) xxxxxxxxxxxxxxx
模式细节:
(?> # open the first non capturing group (* atomic)
(?> # open the second non capturing group
[^()w]++ # all characters except ( ) w, one or more times (* possessive)
| # OR
\Bw++ # some w preceded by a word character (ie: a-zA-Z0-9_)
| # OR
\bw+(?!here\b) # some w not preceded by a word character
# and not followed by "here"
)+ # close the second group and repeat 1 or more times
| # OR
( # open the first capturing group
\( # literal (
(?> # open the third non capturing group
[^()]++ # all characters except ( ), one or more times
| # OR
(?-1) # repeat the last capturing group
)* # close the third non capturing group
# and repeat it zero or more times
\) # literal )
) # close the thirst capturing group
)* # close the first non capturing group
# and repeat 0 or more times
\bwhere\b # "where" not followed and not preceded by a word character
这种模式的目标是匹配所有可能的东西,直到单词&#34;其中&#34;在括号外。