我在MySQL中有一个SQL查询,我想要一个与不在'<'之间的字符串匹配的表达式和'>'。例如:
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
我知道如果它运行在Ruby或PHP等编程语言上,表达式将如下所示
'<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
我找到了similar post,但我不能为我的情况重写它。
你能帮我解决一下匹配字符串而不是html标签内容的表达式(在mysql rlike运算符中运行)吗?
答案 0 :(得分:0)
不幸的是,正则表达式无法可靠地解析像HTML这样的无限下降语言。您将需要使用适当的HTML解析器,我怀疑MySQL包含一个。
您可能会考虑,如果在数据库中执行此操作绝对关键,则创建另一个列,该列仅包含HTML的文本表示形式(同样,使用适当的解析器删除所有标记)并在插入时设置/修改HTML本身。你显然需要让它们保持同步,这可能会很麻烦,但它会极大地简化你的查询。