2010-11-21 7 views
0

私はMySQLでsqlクエリを使用していますが、 '<'と '>'の間の文字列と一致する式が必要です。例:MySQLのhtmlタグ外のテキストの正規表現の照合

select '<span class="boldtext">collaboratively site</span> – regardless of platform or language' rlike 'expression looking for boldtext' ==> should return false because 'boldtext' locates inside a html tag 
select '<span class="boldtext">collaboratively site</span> – regardless of platform or language' rlike 'expression looking for platform' ==> should return true because 'platform' locates outside a html tag 

私は以下で試しましたが運はありません。私は '*'が貪欲であると思う。

select '...' rlike '[^[.<.]]?[^[.>.]]*platform[^[.<.]]*[^[.>.]]?' # This expression doesn't work 

は私が similar postを見つけ、それはRubyや
'<span class="boldtext">collaboratively site</span> – regardless of platform or language' =~ /((?!<[^>]*))\bboldtext\1/ # => false 
'<span class="boldtext">collaboratively site</span> – regardless of platform or language' =~ /((?!<[^>]*))\bplatform\1/ # => true 

PHP

などのプログラミング言語で実行するなら式は以下のようになることを知っていたが、私は私の場合のためにそれを書き換えることはできません。

htmlタグの目的以外の文字列(mysql rlike演算子で実行される)と一致する式をどのように考え出すか教えてください。

+0

[MySQL REGEXPは境界単語にのみ一致しますが、htmlタグでは一致しません](https://stackoverflow.com/a/11130498/2277851) –

答えて

0

残念ながら、正規表現では、HTMLなどの無限下位言語を確実に解析できません。これには適切なHTMLパーサを使いたいと思うでしょうし、MySQLにはそれが含まれているのではないかと思います。

DBのこの操作を実行することが絶対的に重要である場合は、HTMLのテキスト表現のみを含む別の列を作成することもできます(再度、適切なパーサーを使用してすべてのタグを削除します) HTML自体の挿入/変更。明らかにそれらを同期させておく必要がありますが、これは苦痛かもしれませんが、クエリを大幅に簡略化します。

+0

cdhowieに感謝、私はこのアプローチに行きました。幸いにも、私はこのウェブサイトを構築するためにRuby on Railsを使用したので、2番目の列を同期させるのは簡単です。モデルのコールバックがあります:-) –

+0

同じ文章で「幸運にも」と「私はRubyを使用しました」というフレーズを使用しません。 ;) 冗談だ。とにかく、このアプローチを聞いてうれしいです。 – cdhowie