1

SQLステートメント内に1つの文字列(「WHERE」)が存在するかどうかを確認するために、正規表現(経験がほとんどない)を作成しようとしていますが、括弧の間に存在しない場合に限ります。

私はPHPを使用しており、そのコードまたはヘルプをいただければ幸いです。

試したコードを投稿しますが、実際にはどこから始めればよいかわかりません。他の方法を使用して目的の効果を達成しようとしましたが、何らかの問題が発生し続けています。

一連の検索基準に基づいて SQL ステートメントを作成しようとしていますが、考えられる各検索フィールドで、where 比較の前に SQL ステートメントに「WHERE」または「&&」を配置するために天気を判断する必要があります。

しばらくの間 strstr を使用してこれを行いましたが、「WHERE」の使用を必要とする SQL の「SELECT」部分にサブクエリを追加する必要があったため、明らかに私の方法が台無しになりました。

どんなヒントも素晴らしいでしょう。

編集:

声明の冒頭:

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
}

これは明らかに1つの条件だけでは過剰ですが、私のスクリプトには多くの条件があり、最初の条件の後の条件では非常に必要になります.

4

2 に答える 2

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 
      |                # 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 (* possessive)
          |            # 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

このパターンの目標は、括弧の外側の単語「where」まで、可能なすべてに一致することです。

于 2013-07-24T20:21:03.327 に答える