簡體   English   中英

正則表達式:忽略html標簽

[英]regular expression : ignore html tags

我有這樣的HTML內容:

<p>The bedding was hardly <strong>able to cover</strong> it and seemed ready to slide off any moment.</p>

這是HTML的完整版本。 http://collabedit.com/gkuc2

我需要搜索hardly able to cover的字符串(只是一個例子),我想忽略我正在尋找的字符串中的任何HTML標簽。 因為在HTML文件中,字符串中有HTML標記,而簡單的搜索將無法找到它。

用例是:我有兩個版本的文件:

  • 帶有文本和標簽的HTML文件
  • 相同的文件,但只有原始文本(刪除任何標簽和額外的空格)

我要搜索的子字符串(針)來自文本版本(不包含任何HTML標記),我想在HTML版本(具有標簽的文件)中找到它的位置。

什么是正則表達式?

把它放在每個字母之間:

(?:<[^>]+>)*

並用以下內容替換空格:

(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*

喜歡:

h(?:<[^>]+>)*a(?:<[^>]+>)*r(?:<[^>]+>)*d(?:<[^>]+>)*l(?:<[^>]+>)*y(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*a(?:<[^>]+>)*b(?:<[^>]+>)*l(?:<[^>]+>)*e(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*t(?:<[^>]+>)*o(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*c(?:<[^>]+>)*o(?:<[^>]+>)*v(?:<[^>]+>)*e(?:<[^>]+>)*r

如果你想讓標簽打破單詞,你只需要每個字母之間的那些,例如: This is b<b>old</b>

這是沒有信件中斷:

hardly(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*able(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*to(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*cover

這適用於大多數情況。 但是,如果Html格式錯誤,其中<或>不是htmlencoded,則可能會遇到問題。 此外,它可能會破壞腳本塊或CDATA部分的其他元素。

嘗試將文本保存在變量或其他內容中,然后刪除所有標記並執行常規搜索。 你可以使用一個簡單的php函數strip_tags()

編輯:所以你可能會嘗試尋找第一個和最后一個單詞(或者只是第一個,然后再使用結果的其余部分)來找到字符串,然后解析結果並刪除標簽並檢查它是否是你正在尋找的那個對於。 就像使用正則表達式一樣:很難。 覆蓋甚至幾乎沒有。 $並保存每個結果的位置。 然后在結果上使用strip_tags()並分析每個結果(如果它是您想要的結果)。 我知道這是一種奇怪的解決方案,但你可以避免無休止的正則表達式等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM