繁体   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