Php 正则表达式替换HTML中但不在链接或标题中的字符串

Php 正则表达式替换HTML中但不在链接或标题中的字符串,php,html,regex,Php,Html,Regex,我正在寻找一个正则表达式来替换html页面中的给定字符串,但前提是该字符串不是标记本身的一部分,或者在链接或标题中显示为文本 示例: 寻找“替换我” 你可以很好地替换我好的 没有对手 替换我 没有对手 不匹配 replace_me第一个不匹配,第二个确定,第三个不匹配 提前谢谢 更新: 我找到了一个有效的正则表达式 \b(replace_me)\b(?!(?:(?!<\/?[ha].*?>).)*<\/[ha].*?>)(?![^<>]*>) \b(

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

示例:

寻找“替换我”

你可以很好地替换我

好的

没有对手

替换我
没有对手

不匹配

replace_me

第一个不匹配,第二个确定,第三个不匹配

提前谢谢

更新:

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

\b(replace_me)\b(?!(?:(?!<\/?[ha].*?>).)*<\/[ha].*?>)(?![^<>]*>)
\b(替换我)\b(?!(?:(!))*)(?![^]*>)
是个会让你发疯的坏主意。在这方面使用regex可能没有那么糟糕,但无论采用何种方法,都需要考虑以下几点:

  • 一页中有多少个
  • 您将对多少页执行此操作
  • 您是手动检查输出,还是自动检查
  • 您使用哪种编程语言进行此操作
  • 我认为最好的方法不是使用一个“简单”(读起来:非常复杂)的正则表达式,而是一个有一些逻辑支持的适当程序——当然,除非正则表达式是图灵完备的,其他人可以提供一个正则表达式来做你想做的事情:)

    \b(replace_me)\b(?!(:(!)*(![^]*>)
    
    我有一个类似的问题-给定一个HTML字符串,我想用
    tio2
    替换字符串
    tio2
    的所有实例,用
    ticl4
    替换
    ticl4

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

    我选择在HTML字符串上进行两次传递,而不是在试图找到一个单一的、复杂的正则表达式时乱来:

    • 将所有实例替换为
      str\u ireplace
    • 找到任何包含
      的href属性,并修复它们
      preg\u replace\u 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;
      }
      
      公共静态函数subscriptStrings($str)
      {
      //$str是任意字符串,可以是HTML,也可以是纯文本
      //定义搜索/替换
      $map=[
      “tio2”=>“tio2”,
      ‘ticl4’=>‘ticl4’
      ];
      //替换所有实例,不考虑它们的上下文
      $str=str\u ireplace(数组\u键($map)、数组\u值($map)、$str);
      //进行第二次检查,特别是查找href值
      $str=preg_replace_回调('/href=“[^”]+“/”,函数($str){
      //返回除去标记的href值
      返回str_replace(['','','','$str[0]);
      }美元/平方米);
      返回$str;
      }
      

    这不是防弹的,如果出于某种原因,所讨论的链接中应该有某种原因,那么它将失败。

    在regex中这样做会很痛苦,但是:(i)什么语言?(ii)你会考虑使用HTML解析器吗?另外,我认为这可能是在XSLT的范围内。HTML解析器也不会使用正则表达式ES吗?不,它不是。它按字符解析HTML字符并将所有相关的部分存储在树状数据结构中。1。可以有更多的一个2和3。自动化4。PHP之一可能是第一个解决方案。替换标签之间的所有链接和标题,然后执行正则表达式忽略这些标签中的内容?@Alphax你只是个懦夫。如果你不想使用正则表达式,我没问题,但不要指望其他人不使用它
    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;
    }