正则表达式/ SQL - 查找“WHERE”但不在括号之间

时间:2013-07-24 19:59:41

标签: php mysql regex

我正在尝试计算正则表达式(我很少有经验)来检查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
}

这显然只对一种情况有所影响,但是我的脚本会有很多,而在第一种情况之后,这将是非常必要的。

2 个答案:

答案 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;在括号外。