【问题标题】:Regexp matching for text outside html tags in MySQLMySQL中html标签外文本的正则表达式匹配
【发布时间】:2010-11-21 05:54:10
【问题描述】:

我在 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 运算符中运行)吗?

【问题讨论】:

标签: mysql html regex


【解决方案1】:

不幸的是,正则表达式无法可靠地解析像 HTML 这样的无限下降语言。您将需要为此使用适当的 HTML 解析器,我怀疑 MySQL 包含一个。

如果在数据库中执行此操作绝对关键,您可能会考虑创建另一个仅包含 HTML 文本表示的列(同样,使用适当的解析器删除所有标签)并在插入时设置它/修改 HTML 本身。您显然需要使它们保持同步,这可能会很痛苦,但它会极大地简化您的查询。

【讨论】:

  • 感谢 cdhowie,我采用了这种方法。幸运的是,我使用 Ruby on Rails 构建了这个网站,因此很容易使第二列​​保持同步。只需对模型进行回调:-)
  • 我不会在同一个句子中使用短语“luckily”和“I used Ruby”。 ;) 只是在开玩笑。 (有点。)无论如何,很高兴听到这种方法对你有用。
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
相关资源
最近更新 更多