2009-09-02 134 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解析;))