[英]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.