2011-06-06 51 views
2

我有类似如下; -匹配文本

<--customMarker>Test1<--/customMarker> 
<--customMarker key='myKEY'>Test2<--/customMarker> 
<--customMarker>Test3 <--customInnerMarker>Test4<--/customInnerMarker> <--/customMarker> 

我需要能够在customMarker标签之间的替换文本,我尝试以下; -

str.replace(/<--customMarker>(.*?)<--\/customMarker>/g, 'item Replaced') 

哪些工作正常。我想也忽略自定义内部标签,不匹配或替换文本。

另外我需要一个单独的表达式来从Text2标签中提取属性key ='myKEY'的值。

非常感谢

编辑 其实我想找到注释标记,但注释标签不正确显示之间的事情,所以我不得不删除“!”。有一个独特的情况,需要评论标签...如果有人知道足够的正则表达式来帮助,这将是非常棒的。谢谢你。

+3

待办事项你有这样做吗?看起来很复杂。 – Kevin 2011-06-06 11:44:42

+0

oops ...!没有意识到已经添加了评论。我已经调整了一下这个问题,我只需要忽略内部标签,并且需要一个表达式来从标签 – ClaraU 2011-06-06 12:35:45

+0

Buddy中提取属性键,当您添加自定义标签时,它将被称为xml。不是吗? – 2011-06-06 12:36:54

回答

2

最后,我不喜欢的东西下面(柜面任何人都需要这种享受!但是要注意:闭口不谈镇是使用正则表达式HTML标记是不理想的,所以做自己的研究和让你的心对我来说,它必须做这样一来,大多BCOS我想,也BCOS它简化了在这种情况下)工作; -

var retVal = str.replace(/<--customMarker>(.*?)<--\/customMarker>/g, function(token, match){ 
    //question 1: I would like to also ignore custom inner tags and not match or replace them with text. 
    //answer: 
    var replacePattern = /<--customInnerMarker*?(.*?)<--\/customInnerMarker-->/g; 
    //remove inner tags from match 
    match = $.trim(match.replace(replacePattern, '')); 
    //replace and return what is left with a required value 
    return token.replace(match, objParams[match]); 

    //question 2: Also I need a separate expression to extract the value of the attribute key='myKEY' from the tag with Text2. 
    //answer 
    var attrPattern = /\w+\s*=\s*".*?"/g; 
    attrMatches = token.match(attrPattern);//returns a list of attributes as name/value pairs in an array  

})

0

你不能用<customMarker>代替吗?然后,您可以使用getElementsByTagName('customMarker')并从中获取内部文本和子元素。

0

正则表达式仅仅匹配一个项目。一旦你说过匹配,这取决于你如何处理它。这是大多数人使用正则表达式的问题的一部分,他们尝试并结合三个不同的步骤。正则表达式匹配只是第一步。

对于单个正则表达式,您所要求的内容将无法实现。如果你想使用正则表达式,你将需要一个迷你状态机。也就是说,围绕匹配的逻辑包装器,以便它在每个逻辑部分中移动。

我会建议你在标准api中寻找一个预编译引擎来解析html,而不是滚动你自己的。如果您确实需要这样做,请阅读flex manual以了解正则表达式的工作原理以及您使用它们构建的状态机。最好的例子是匹配多行c注释的部分。