![](/img/trans.png)
[英]How do I search for a field in an ado database in delphi with a sql query?
[英]How do I query a database field but ignore the HTML markup?
我們有一個字段,其中包含用於在網站上格式化的HTML標記,但我們只需查詢應在屏幕上呈現的文本,而不是CSS標記,標記名稱,屬性名稱等。
有沒有辦法忽略SQL查詢或存儲過程中的標記? 如果有辦法做到這一點,我們以后會遇到性能問題嗎?
我的猜測是有一些方法可以使用尖括號來解析字段以獲取可搜索的文本。
不應該在數據庫中進行這樣的處理。 我建議創建一個僅包含文本內容的單獨字段。
回應@Nissan粉絲評論:從HTML中提取文本不是數據庫的工作IMO。 它的工作太復雜了,而且變量太多了。 我不太熟悉讀取存儲過程但是如果我正確地讀取代碼,它將在源代碼中出現(無效但仍然經常出現)未編碼的<
問題。 它很可能會因無效的HTML而中斷。
或者想象有一天,客戶來了,也希望img
元素的ALT
屬性也被編入索引。 或者title
。 使用“開始位置,結束位置”算法開始構建。 你會發瘋的 。
我說,如果需要在日常的基礎上處理來自控制之外的不同來源的HTML,請將其留在數據庫上方,以便更好地處理這些內容。 基於DOM的方法 - 也許使用BeautifulSoup來處理無效的HTML - 解析出所有nodeValue
將是最可靠的事情。
也許這有點過分了,存儲過程在OP的情況下也能正常工作 - 從他的評論中看起來就像是這樣,而且這完全沒問題。 我只是說,如果你無法控制傳入的HTML,請不要使用數據庫為作業提供的有限手段來剝離HTML。
我同意佩卡的意見; 這不是您的數據庫應該處理的事情。
在DB中進行此解析的缺點:
性能問題。 使用UDF會降低性能並導致表掃描。 即使你避免使用表掃描,你仍然要求數據庫做一些它不是設計的東西(字符串操作)。
更難以正確。 正確解析HTML是一項艱巨的任務。 確實,你可以使用UDF獲得95%的方式,但是在應用程序層中處理這個問題可能會讓你100%完成任務。
更難測試。 我更願意編寫針對字符串文字在C#中執行的HTML剝離代碼的單元測試,而不是必須往返數據庫。
如果你必須在DB中這樣做...
如果需要在DB中執行此操作,請考慮以下方法:
在數據庫中添加第二個字段以保存內容的純文本版本。
添加觸發器,以便每次更改HTML值時,都會重新生成文本版本。
根據純文本字段編寫查詢。
您將獲得更好的性能,因為您只在寫入時進行解析,而不是在每次搜索時進行解析,並且您的數據庫將更好地利用您在純文本字段上定義的任何索引。
如果您可以在查詢中運行正則表達式,則可以使用以下示例刪除HTML並僅返回文本: http : //www.regular-expressions.info/examples.html
如果您嘗試索引其中一列並通過刪除html來訪問它:
WHERE dbo.anyRemoveHtml(yourColumn)='your search text'
不會使用索引,您將進行表掃描。 當應用程序的數據很少時,這可能不是問題,但隨着向表中添加更多數據,將導致更慢和更慢的SELECT。
注意:dbo.anyRemoveHtml只是一個組成的名稱,表示您選擇刪除HTML的函數,並不存在
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.