2010-08-24 33 views
3

我有以下as3函數將鏈接轉換爲普通html,以便鏈接具有「event:」前綴,以便我可以使用TextEvent偵聽器捕獲它們。as3中的正則表達式忽略與特定的字符串匹配的匹配

protected function convertLinks(str:String):String 
{ 
    var p1:RegExp = /href|HREF="(.[^"]*)"/gs; 
    str = str.replace(p1,'HREF="event:$1"'); 
    return str; 
} 

例如

<a href="http://www.somedomain.com"> 

被轉換爲

<a href="event:http://www.somedomain.com"> 

這一切正常,但我有已經被轉換鏈接的問題。

我需要排除在那裏我有一個字符串,如

<a href="event:http://www.somedomain.com"> 

接通功能的情況下,因爲在這一刻被轉換到

<a href="event:event:http://www.somedomain.com"> 

打破了鏈接。

我該如何修改我的函數,以便在開始時與'event:'的鏈接不匹配並保持不變?

回答

4

首先,嘗試使用正則表達式處理HTML可能不是一個好主意。

也就是說,根據flavor comparison chart on regular-expressions.info,ActionScript正則表達式基於ECMA引擎,該引擎支持lookaheads

因此,你可以這樣寫:

/(?:href|HREF)="(?!event:)(.[^"]*)"/ 

(?=…)積極先行;它聲稱一個給定的模式可以匹配。 (?!…) is negative lookahead;它斷言一個給定的模式可以與不匹配匹配。

請注意,包含.是非常奇特的。可能無意在此處包括.,因爲它可以匹配雙引號。

還請注意,我已經通過使用非捕獲group(?:…)修復了alternationhref/HREF

這是因爲:

  • this|that匹配任一"this""that"
  • this|that thing匹配任一"this""that thing"
  • (this|that) thing匹配任一"this thing""that thing"

替代你可能也想打開case-insensity flag /i,它可以處理像hReFeVeNt:這樣的事情。

因此,也許你的模式應該只是

/href="(?!event:)([^"]*)"/gsi 

如果向前看沒有得到支持,你可以使用匹配event:如果它的存在,從第1組中排除的optional模式,所以它不當你在$1替代時獲得包括。

/href="(?:event:)?([^"]*)"/gsi 
     \________/ \_____/ 
    non-capturing group 1 
    optional 
+0

polygenelubricants,非常感謝,您的原始代碼行正是我所需要的,因爲lookahead是支持的。 也謝謝你的附加信息。 RegEx似乎是一個非常具體的思維方式,我還沒有完全掌握自己的想法。你真的需要正確地學習所有的語法,所以謝謝你的詳細解釋。 – Stanz 2010-08-24 12:49:24

相關問題