我有这样的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版本中找到它的位置(有标签的文件。)
什么是正常表达式?
答案 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()并分析每个结果(如果它是您想要的结果)。 我知道这是一种奇怪的解决方案,但你可以避免无休止的正则表达式等。