【问题标题】:Regex to replace reg trademark正则表达式替换 reg 商标
【发布时间】:2010-11-24 23:32:50
【问题描述】:

我需要一些关于正则表达式的帮助:

我得到了一个 html 输出,我需要用 <sup></sup> 包装所有注册商标

我不能在标题和alt 属性中插入<sup> 标签,显然我不需要包装已经上标的reg。

以下正则表达式匹配不属于 HTML 标记的文本:

(?<=^|>)[^><]+?(?=<|$)

我正在寻找的一个例子:

$original = `<div>asd&reg; asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>`

过滤后的字符串应该输出:

<div>asd<sup>&reg;</sup> asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>

非常感谢您的宝贵时间!!!

【问题讨论】:

    标签: php html regex preg-replace symbols


    【解决方案1】:

    我真的会使用 HTML 解析器来代替正则表达式,因为 HTML 不是正则的,并且会呈现比您想象的更多的边缘情况(忽略您在上面确定的上下文限制)。

    你没有说你正在使用什么技术。如果你把它贴出来,毫无疑问有人会推荐合适的解析器。

    【讨论】:

    • 明白你的意思... ;) 我正在开发一个 drupal(php) 项目...我必须只使用“开箱即用”的东西...这就是为什么我寻找一个正则表达式......所以我可以将它用作 preg_replace 中的模式......:/
    【解决方案2】:

    Regex 不足以满足您的需求。首先,您必须编写代码来识别内容何时是属性值或元素的文本节点。然后你必须通过所有这些内容并使用一些替换方法。我不确定它在 PHP 中是什么,但在 JavaScript 中它看起来像:

    content[i].replace(/\&reg;/g, "<sup>&reg;</sup>");
    

    【讨论】:

      【解决方案3】:

      我同意 Brian 的观点,正则表达式不是解析 HTML 的好方法,但如果您必须使用正则表达式,您可以尝试将字符串拆分为标记,然后在每个标记上运行您的正则表达式。

      我使用preg_split 来拆分HTML 标记以及短语&lt;sup&gt;&amp;reg&lt;/sup&gt; 上的字符串——这将留下不是上标&amp;reg; 或标记作为标记的文本。那么对于每个token,&amp;reg;可以替换为&lt;sup&gt;&amp;reg;&lt;/sup&gt;

      $regex = '/(<sup>&reg;<\/sup>|<.*?>)/i';
      $original = '<div>asd&reg; asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>';
      
      // we need to capture the tags so that the string can be rebuilt
      $tokens = preg_split($regex, $original, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
      /* $tokens => Array
      (
          [0] => <div>
          [1] => asd&reg; asdasd. asd
          [2] => <sup>&reg;</sup>
          [3] => asd
          [4] => <img alt="qwe&reg;qwe" />
          [5] => </div>
      )
      */
      
      foreach ($tokens as &$token)
      {
          if ($token[0] == "<") continue; // Skip tokens that are tags
          $token = substr_replace('&reg;', '<sup>&reg;</sup>');
      }
      
      $tokens = join("", $tokens); // reassemble the string
      // $tokens => "<div>asd<sup>&reg;</sup> asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>"
      

      请注意,这是一种幼稚的方法,如果输出的格式不符合预期,它可能不会像您想要的那样解析(同样,正则表达式不适合 HTML 解析;))

      【讨论】:

        【解决方案4】:

        好吧,这是一个简单的方法,如果您同意以下限制:

        那些已经被处理过的 紧跟在 ®

        之后
        echo preg_replace('#&reg;(?!\s*</sup>|[^<]*>)#','<sup>&reg;</sup>', $s);
        

        背后的逻辑是:

        1. 我们只替换那些 ®后面没有 和...
        2. 后面不跟> simbol不开

        【讨论】:

        • 非常感谢大家!我将为我的情况采用这个解决方案......但我感谢大家的建议......关于它的其他任何事情我都会告诉你!谢谢!!!
        猜你喜欢
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        • 2015-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多