ruby
  • regex
  • 2012-06-08 34 views 0 likes 
    0

    我需要將%{ ... %}的所有實例與<span code='notranslate'>...</span>包裝在一起,除非%{ ... }出現在HTML標記中。例如,這樣的:Ruby正則表達式替換所有發生的情況,除非HTML屬性

    "Or %{register_text} for a new account by <a href='%{path}'>clicking here</a>." 
    

    需要成爲這個

    "Or <span code='notranslate'>%{register_text}</span> for a new account by <a href='%{path}'>clicking here</a>." 
    

    我現在的正則表達式並沒有考慮到HTML標籤狀況:

    x.gsub(/[?<!]%\{([a-zA-Z0-9_\-]*)\}[?>!]/i) {|s| "<span class='notranslate'>#{s}</span>"} 
    

    ,所以我想知道如何用正則表達式在Ruby中執行此操作。

    任何接受者?

    +0

    輸入字符串中是否存在Javascript?我的意思是嵌入JS特別。 – nhahtdh

    +2

    用xpath表達式比正則表達式更好。 –

    回答

    0

    我不確定輸入空間,所以這是我能想到的最好的。我還一路清理了正則表達式。

    /%\{[\w-]+\}(?![^<>]>)/ 
    

    對於格式良好的HTML,它只會匹配標籤外部的標記。如果HTML格式不正確,我認爲我無法完成編寫正則表達式的任務。

    我還假設頁面中沒有嵌入Javascript,因爲在Javascript中的><未被轉義。

    +0

    好的 - 我不得不做一個小小的修改來逃避{}:'/ \%{([\ w-] *)()!'[^ <>] *>)/'但是我得到一個奇數* *警告:正則表達式在Ruby中有無效的間隔**消息。有什麼想法嗎? – JoshL

    +0

    有必要嗎?雖然它在rubular上運行良好。無效的消息很可能是由於'-',你可以嘗試轉義'\ -'嗎? – nhahtdh

    +0

    '[\ w-]'中的連字符很好。 「間隔」可能指的是一個「{最小,最大}」量詞。我會同時使用兩個大括號:'%\ {([\ w - ] *)\}' - 或者至少是第一個:'%\ {([\ w - ] *)} –

    相關問題