2010-08-24 43 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

相关问题