2

ユーザー入力を取得してmysqlフィールドを検索する検索機能に取り組んでいます。アイデアは、ユーザーが検索する単語を分割し、問題のフィールド内の各用語を探すことです。

私が使用している正規表現を構築するために使用されたコードは、動作する純粋な PHP スクリプトからコピーされたものです (正規表現は PHP で正常に動作するように見えるため、正規表現のフレーバーの違いであると思われます)

これが明らかな問題であり、まだ正規表現の感触をつかんでいる場合はご容赦ください。

最初に、実行したクエリと発生したエラーを示します。

"SELECT * from `images` WHERE ( `name` REGEXP '^(?=.*gallardo).*$' OR `meta` REGEXP '^(?=.*gallardo).*$' ) ORDER BY `changestamp` DESC

正規表現から「繰り返し演算子オペランドが無効です」というエラーが発生しました」

SELECT * from `images` WHERE ( `name` REGEXP '^(?=.*gallardo)(?=.*lambo).*$' OR `meta` REGEXP '^(?=.*gallardo)(?=.*lambo).*$' ) ORDER BY `changestamp` DESC

同じエラーが発生します

この正規表現をコンパイルするには、「gallardo lambo」などのユーザーが送信した入力を取得し、この PHP プロシージャを実行します

if(isset($_GET['keyword'])){

        $searchterms = explode(' ',$_GET['keyword']);

        $regstr = '^';

        foreach($searchterms as $i => $v)
        {
            if($v)
                $regstr .= '(?=.*'.preg_replace('/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/', "\\$&", $v).')'; 
        }

        $regstr .= '.*$';

    }

次に、次のようにクエリに入れます

"( `name` REGEXP '$regstr' OR `meta` REGEXP '$regstr' )"

このメソッドを php で使用するpreg_match()と、うまくいくようです。

洞察はありますか?自分が何をしているのかわからないことを遠慮なく言ってください。

ありがとう!

4

1 に答える 1

5

MySQL の正規表現は PHP よりも限定的です。後方参照や先読みをサポートしていません。マニュアルを参照してください。

代わりに全文検索を検討することをお勧めします。

于 2012-05-04T23:04:22.510 に答える