1

この文字列から単語を取得し、SQLステートメントでAND LIKE / NOT LIKEに置き換える必要がありますが、それを理解しようとして髪を引っ張っています:-)

$string = "hello -world !someword ! again |foo &foo AND foo ORfoo";
if (preg_match_all("/AND|OR|\||&|!|\-(\w+)/", "$string", $matches)) {
        foreach ($matches as $match) {
                foreach ($match as $m) {
                        // 1. figure out what the delimiter was (!, |, &, -, AND, OR
                        // 2. create a sql statement from it using the word following the delimiter
                        // Example:
                        if ($m = "!") {
                                $where .= " AND msg NOT like '%".$m."%'";
                        }
                        if ($m = "AND") {
                                $where .= " AND msg like '%".$m."%'";
                        }
                        if ($m = "OR") {
                                $where .= " OR msg like '%".$m."%'";
                        }
                }
        }
}
echo $where;
4

2 に答える 2

2

以下のコードを使用して、正規表現の一致を収集します。preg_match_allは、特定のパターンのすべての出現を収集することを目的としていることを忘れないでください。代わりにpreg_matchを使用したことに注意してください。「\s*」を使用すると、空白が存在する場合はそれを一致させることができます。

$results = array();
$word_to_capture = '\s*(\w+)%';
$patterns[] = "%(AND)" . $word_to_capture;
$patterns[] = "%(&)" . $word_to_capture;
$patterns[] = "%(OR)" . $word_to_capture;
$patterns[] = "%(\|)" . $word_to_capture;
$patterns[] = "%(!)" . $word_to_capture;
$patterns[] = "%(-)" . $word_to_capture;

foreach($patterns as $p):
    preg_match($p,$string,$matches);
    $results[] = $matches;
endforeach;

次に、$ results配列を反復処理して、MySQLクエリを作成できます。結果の配列は次のようになります。

Array
(
    [0] => Array
        (
            [0] => AND foo
            [1] => AND
            [2] => foo
        )

    [1] => Array
        (
            [0] => &foo
            [1] => &
            [2] => foo
        )

    [2] => Array
        (
            [0] => ORfoo
            [1] => OR
            [2] => foo
        )

    [3] => Array
        (
            [0] => |foo
            [1] => |
            [2] => foo
        )

    [4] => Array
        (
            [0] => !someword
            [1] => !
            [2] => someword
        )

    [5] => Array
        (
            [0] => -world
            [1] => -
            [2] => world
        )

)

正規表現にキャプチャを追加しました。さまざまなパターンが要素1に含まれ、単語が要素2に含まれます。

以下のコードを使用して、クエリフラグメントを作成できます。

$query_fragment = "";
foreach($results as $r):
    switch (trim($r[1])):
        case "AND":
            $query_fragment .= " AND msg LIKE '%" . $r[2] . "%'";
            break;
        case "!":
            $query_fragment .= " AND msg NOT LIKE '%" . $r[2] . "%'";
            break;
        case "&":
            $query_fragment .= " AND msg LIKE '%" . $r[2] . "%'";
            break;
        case "OR":
            $query_fragment .= " OR msg LIKE '%" . $r[2] . "%'";
            break;
        case "|":
            $query_fragment .= " OR msg LIKE '%" . $r[2] . "%'";
            break;
    endswitch;
endforeach;
于 2012-04-06T22:09:24.040 に答える
1

トリガーを個別にキャプチャする必要があります。あれは:

/(AND|OR|\|&|!-)(\w+)/

現在、式はダッシュに続く単語のみをキャプチャします。

ループも正しくありません。あなたは次のようなものが欲しい

foreach ($matches[1] as $count => $match) {
   if ($match == '!') {
      $where . = " AND msg NOT LIKE '%" . $matches[2][$count] . "%'";
   }
}

SQLインジェクションもあなたにとって懸念事項かもしれません。

于 2012-04-06T22:03:30.297 に答える