web-dev-qa-db-ja.com

#1139-正規表現からエラー「繰り返し演算子のオペランドが無効です」が発生する

正規表現を使用してMySQLテーブルから結果を選択するのに問題があります。

このクエリを使用しています

SELECT text 
FROM `articles` 
WHERE content REGEXP '.*<img.*?src=\"http://www' 
ORDER BY date DESC

そしてそれは言う

#1139 - Got error 'repetition-operator operand invalid' from regexp

私はNotepad ++で正規表現をテストしましたが動作しますが、MySQLがなぜこのエラーを出しているのですか、どうすれば修正できますか?

22
BackSlash

MySQLマニュアル によると

MySQLは、POSIX 1003.2への準拠を目的としたヘンリースペンサーの正規表現の実装を使用します。

POSIX正規表現 疑問符?をスターの貪欲でない(レイジー)修飾子として使用することと、PCRE(Perl互換の正規表現)などの数量詞をサポートしない。つまり、+?および*?は使用できません。

貪欲なバージョンを使用する必要があるようですが、それでも機能します。 <img style="/*some style*/" src="a.png"> <script src="www.example.com/js/abc.js">などの一致を回避するには、否定された文字クラスを使用できます。

'<img[^>]*src="http://www'

注:"はエスケープする必要はなく、最初の.*が暗黙に示されます。

45

あなたが試すことができます、

SELECT 
        text 
        , 
     IF (content LIKE '%<img src="http://%', text  , content LIKE '%<img style=%') 
as imageText

FROM    articles ORDER BY date DESC

これにより、コンテンツが<img src="http://のある場所が最初に確認され、見つからない場合は、代わりに<img style=が検索されます。

それが役に立てば幸い。

フィドルを確認: http://sqlfiddle.com/#!2/6a2f0/13/0

0
ErickBest