正则表达式:忽略html标签

时间:2015-07-13 16:55:48

标签: javascript php html regex search

我有这样的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版本中找到它的位置(有标签的文件。)

什么是正常表达式?

2 个答案:

答案 0 :(得分:3)

把它放在每个字母之间:

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

并用以下内容替换空格:

(?:\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格式错误,其中&lt;或者&gt;不是htmlencoded,你可能遇到问题。此外,它可能会破坏脚本块或CDATA部分的其他元素。

答案 1 :(得分:0)

尝试将文本保存在变量或其他内容中,然后删除所有标记并执行常规搜索。 您可以使用简单的php函数strip_tags()

修改 因此,您可能会尝试查找第一个和最后一个单词(或者只是首先然后使用结果的其余部分来查找字符串),然后解析结果并删除标记并检查它是否是您要查找的那个。 喜欢使用正则表达式: 几乎不盖 甚至 几乎不 $ 并保存每个结果的位置。 然后在结果上使用strip_tags()并分析每个结果(如果它是您想要的结果)。 我知道这是一种奇怪的解决方案,但你可以避免无休止的正则表达式等。