[英]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版本(具有標簽的文件)中找到它的位置。
什么是正則表達式?
把它放在每個字母之間:
(?:<[^>]+>)*
並用以下內容替換空格:
(?:\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.