【问题标题】:Finding substring whilst ignoring HTML tags在忽略 HTML 标记的同时查找子字符串
【发布时间】:2015-03-11 15:46:15
【问题描述】:

我需要匹配部分字符串,同时忽略 HTML 标记。这意味着如果用户想在源代码中查找字符串“foo and foo1”。

Two strings, <u>foo</u> and foo1

因为标签,他不会得到匹配。

我试过正则表达式,但是由于标签 candon't have to be 在那里,它似乎太复杂了。

它不是服务器端脚本。这将是一个从控制台运行的应用程序。

更具体地说: 用于语法高亮。所以用户希望“foo and foo1”是斜体,但它的一部分已经下划线并且无论如何都不会匹配。这就是为什么我不能剥离字符串。

【问题讨论】:

  • 您遇到的实际问题是什么?删除所有标签,以便用户可以匹配单词组合?
  • 可能是一个 DOM 解析器,例如 DOMDocument
  • @stribizhev 不。未从文件中删除任何内容,但仍能找到字符串
  • @Croolman - 如果不制作去除标签的中间字符串,则无法完成。所以这就是你的答案。
  • @Croolman - 您可以调查 Google 在搜索时是如何进行的,然后选择 cached。显然有办法。可能使用 dom 获取内容,然后插入高亮,然后重构。

标签: php regex


【解决方案1】:

使用 PHP 函数 strip_tags 从文本中删除 HTML 标记。然后进行搜索。

http://php.net/manual/en/function.strip-tags.php

【讨论】:

  • 这才是正道!
  • 我需要它们。
【解决方案2】:

按照您的建议使用strip_tags,这确实是最好的方法。但是,如果您想玩得开心或尝试对您的正则表达式引擎进行基准测试:) 您可以在查询的每个符号通过后插入(?:&lt;\/?[^&gt;]+&gt;)?,您将获得匹配,并且在查询的最开始(或开头标签不会被捕获)。

这里是一个“foo and foo1”的例子:

(?:&lt;\/?[^&gt;]+&gt;)?f(?:&lt;\/?[^&gt;]+&gt;)?o(?:&lt;\/?[^&gt;]+&gt;)?o(?:&lt;\/?[^&gt;]+&gt;)? (?:&lt;\/?[^&gt;]+&gt;)?a(?:&lt;\/?[^&gt;]+&gt;)?n(?:&lt;\/?[^&gt;]+&gt;)?d(?:&lt;\/?[^&gt;]+&gt;)? (?:&lt;\/?[^&gt;]+&gt;)?f(?:&lt;\/?[^&gt;]+&gt;)?o(?:&lt;\/?[^&gt;]+&gt;)?o(?:&lt;\/?[^&gt;]+&gt;)?1(?:&lt;\/?[^&gt;]+&gt;)?

这将匹配&lt;u&gt;foo&lt;/u&gt; and foo1

https://regex101.com/r/aF8fJ8/4

【讨论】:

  • 你会认为fooand bar 是原子的。
  • 这太惊人了。问题是,如果搜索条件由正则表达式给出。
  • @Croolman:然后,您可以将其实现为纯文本搜索,并警告用户正则表达式选项限制。 :)
  • 接受了较早的答案,因为那是正确的答案,尽管您对这个主题的详细说明。
  • @Croolman 我想这就是为什么我不能剥离字符串意味着你不能依赖strip_tags。没关系,你找到了出路。
【解决方案3】:

这个正则表达式会忽略 html 标签中的 和斜线,只提取单词。

(?!</?[^>]+>)([a-zA-Z]+)

只需将 [a-zA-Z]+ 替换为您要匹配的内容即可。

【讨论】:

  • 不要使用 Regex 解析 HTML。
  • 这匹配 中的所有内容
猜你喜欢
  • 2011-02-05
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 2014-08-16
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
相关资源
最近更新 更多