【问题标题】:Regex to replace a string in HTML but not within a link or heading正则表达式替换 HTML 中的字符串,但不在链接或标题中
【发布时间】:2011-03-02 02:05:44
【问题描述】:

我正在寻找一个正则表达式来替换 html 页面中的给定字符串,但前提是该字符串不是标签本身的一部分或在链接或标题中显示为文本。

例子:

寻找'replace_me'

<p>You can replace_me just fine</p>好的

<a href='replace_me'>replace_me</a> 不匹配

<h3>replace_me</h3> 不匹配

<a href='/test/'><span>replace_me</span></a> 不匹配

<p style="background:url('replace_me')">replace_me<h1>replace_me</h1></p>第一个不匹配,第二个OK,第三个不匹配

提前致谢!

更新:

我找到了一个有效的正则表达式

\b(replace_me)\b(?!(?:(?!<\/?[ha].*?>).)*<\/[ha].*?>)(?![^<>]*>)

【问题讨论】:

  • 这在正则表达式中会很痛苦,但是:(i)什么语言? (ii) 您会考虑改用 HTML 解析器吗?另外,我认为这可能在 XSLT 的范围内。
  • HTML 解析器不会也使用正则表达式吗?
  • 不,它没有。它逐个字符解析 HTML 并将所有相关部分存储在树状数据结构中。

标签: php html regex


【解决方案1】:

Parsing HTML with regex 是一个会让你发疯的坏主意。对此使用正则表达式可能没有那么糟糕,但无论您采用何种方法,都需要考虑一些事情:

  1. 一个页面中有多少个?
  2. 您要这样做多少页?
  3. 您会手动检查输出,还是自动检查?
  4. 您为此使用哪种编程语言?

我认为最好的方法不是使用“简单”(阅读:极其复杂)的正则表达式,而是一个适当的程序,它背后有一些逻辑 - 除非正则表达式是图灵完备的并且其他人可以提供一个正则表达式来做什么你当然想要:)

【讨论】:

  • 1.可以有不止一个 2 和 3。自动化 4. PHP 解决方案之一可能是首先替换 标签之间的所有链接和标题,然后执行正则表达式忽略这些标签内的内容?
  • @Alphax 你只是个懦夫。如果您不想使用正则表达式,我很好,但不要指望其他人不使用它
【解决方案2】:
\b(replace_me)\b(?!(?:(?!<\/?[ha].*?>).)*<\/[ha].*?>)(?![^<>]*>)

【讨论】:

    【解决方案3】:

    我遇到了类似的问题 - 给定一个 HTML 字符串,我想将字符串 tio2 的所有实例替换为 TiO&lt;sub&gt;2&lt;/sub&gt;,并将 ticl4 替换为 TiCl&lt;sub&gt;4&lt;/sub&gt;。

    这很容易通过简单的字符串替换来完成,但在某些情况下,“needle”字符串出现在域名中,例如www.ilovetio2.com,www.tastytastyticl4.info。在这些情况下,href 属性将被字符串替换破坏。

    我选择在 HTML 字符串上进行两次传递,而不是四处寻找一个复杂的正则表达式:

    • 将所有实例替换为str_ireplace
    • 找到任何包含&lt;sub&gt;...&lt;/sub&gt;的href属性并修复它们preg_replace_callback

      public static function subscriptStrings($str)
      {
      
          // $str is arbitrary string which may be HTML, may be plain text
      
          // Define search / replacements
          $map = [
              'tio2' => 'TiO<sub>2</sub>',
              'ticl4' => 'TiCl<sub>4</sub>'
          ];
      
          // Replace ALL instances, paying no heed to their context
          $str = str_ireplace(array_keys($map), array_values($map), $str);
      
          // Make a second pass, specifically looking for href values
          $str = preg_replace_callback('/href="[^"]+"/', function ($str) {
      
              // Return the href value stripped of <sub> tags
              return str_replace(['<sub>', '</sub>'], '', $str[0]);
          }, $str);
      
          return $str;
      }
      

    这不是万无一失的,如果由于某种原因相关链接应该由于某种原因在其中包含 ,则会失败。

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多