2010-11-21 134 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 

我知道,表達會像下面,如果是在編程語言像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裏運行)?

+0

這裏的答案對我有用[MySQL REGEXP僅匹配邊界字,但不包括html標籤中的匹配項](https://stackoverflow.com/a/11130498/2277851) – 2017-05-26 14:34:06

回答

0

不幸的是,正則表達式不能可靠地解析像HTML這樣的無限下降語言。你會想爲此使用一個合適的HTML解析器,並且我懷疑MySQL包含了一個。

如果在數據庫中執行此操作是絕對關鍵的,則可以考慮創建另一個只包含HTML文本表示的列(再次使用適當的分析器刪除所有標記)並設置該列插入/修改HTML本身。你顯然需要保持同步,這可能是一個痛苦,但它會極大地簡化你的查詢。

+0

感謝cdhowie,我採用了這種方法。幸運的是,我使用Ruby on Rails構建了這個網站,因此很容易保持第二列的同步。只需在模型上進行回調:-) – 2010-11-23 15:04:41

+0

我不會在同一句中使用短語「幸運」和「我用紅寶石」。 ;) 開玩笑。 (排序)無論如何,很高興聽到這種方法適合你。 – cdhowie 2010-11-23 17:59:38