2009-09-02 106 views
2

我需要一些帮助与正则表达式:正则表达式替换REG商标

我有一个HTML输出,我需要包装的所有注册商标与<sup></sup>

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

下面的正则表达式匹配的文本,是不是一个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> 

非常感谢您的时间!

回答

3

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

那些已经处理那些暂存器有</SUP >继&之后REG;

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

背后的逻辑是:

  1. 我们只更换那些& REG;其后不跟着</sup >和...
  2. 这不跟>辛博尔不打开<符号
+0

非常感谢你们! 我会为我的情况采取这种解决方案...但我感谢你们所有的建议... 其他任何事情我会让你知道! thx !!! – Wil 2009-09-02 17:02:56

3

我真的会使用HTML解析器来代替正则表达式,因为HTML并不经常,并且会呈现比您梦寐以求的更多边缘案例(忽略上面确定的上下文限制)。

你不说你正在使用什么技术。如果你发布了,那么有人可以毫无疑问地推荐适当的解析器。

+0

了您的点... ...;) 我工作的一个Drupal(PHP)项目......我只能用“出来的盒子“的东西... 这就是为什么我正在寻找一个正则表达式...所以我可以用它作为preg_replace模式...:/ – Wil 2009-09-02 14:55:24

0

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

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

我与布莱恩同意,正则表达式不解析HTML的好办法,但如果你必须使用正则表达式,您可以尝试将字符串拆分为令牌,然后在每个令牌上运行您的正则表达式。

我使用preg_split来分割HTML标签上的字符串以及短语<sup>&reg</sup> - 这会使文本不是已经上标&reg;或标记为标记。然后,对于每个令牌,&reg;可以用<sup>&reg;</sup>取代:

$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解析;))