RegEx-如何解析模式的html页面(在JavaScript中)

时间:2009-05-22 18:36:51

标签: javascript html regex

我需要解析一个patern的html页面。我假设匹配被加载到一个数组。然后我需要输出数组的内容。

<script language="JavaScript" type="text/javascript">
var adBookmarkletData=[
'<html><head><title>MYSA Yahoo! APT Debugger</title></head><body><center><div style=\"background:#ccc;color:#000;width:350px;text-align:left;padding:15px;border:2px #000;\">','<b>MYSA Yahoo! APT Debugger:</b><br /><hr />',
'<b>URL:</b> '+document.location.href+'<br />',
'<b>Pub ID:</b> '+window.yld_mgr.pub_id+'<br />',
'<b>Site Name:</b> '+window.yld_mgr.site_name+'<br />',
'<b>Content Topic ID List:</b> '+window.yld_mgr.content_topic_id_list+'<br />',
'<b>Site Section Name List:</b> '+window.yld_mgr.site_section_name_list+'<br />'
];
for(i in window.yld_mgr.slots){
    adBookmarkletData.push('<b>Ad:</b> ('+i+')<b>Category:</b>('+window.yld_mgr.slots[i].cstm_content_cat_list+')<br />');
    };
//Here my problem starts
    var myRegExp = new RegExp("place_ad_here\('(.*?)'\)");
//Here my Problem ends
adBookmarkletData.push(myRegExp.exec(document.innerHTML));

adBookmarkletData.push('</div></center></body></html>');
function createAptDebugger(){
   for (i in adBookmarkletData){
    document.write(adBookmarkletData[i]);
    }
};
void(createAptDebugger());
</script>

RegEx模式适用于在线测试仪中的示例代码。但是这里的结果是空的。 我不知道如何将RegEx指向html页面,然后从数组中输出。

为了清楚起见,html将在正文中包含这样的标记。

<script type="text/javascript">yld_mgr.place_ad_here('A728');</script>
<script type="text/javascript">yld_mgr.place_ad_here('ASPON120');</script>
<script type="text/javascript">yld_mgr.place_ad_here('ROLLOVER');</script>
<script type="text/javascript">yld_mgr.place_ad_here('A300');</script>
<script type="text/javascript">yld_mgr.place_ad_here('Middle1');</script>
<script type="text/javascript">yld_mgr.place_ad_here('B300');</script>

结果如下:

place_ad_here('A728')
place_ad_here('ASPON120')
place_ad_here('ROLLOVER')
place_ad_here('A300')
place_ad_here('Middle1')
place_ad_here('B300')

这就是我想要展示它们的方式。

提前致谢...

3 个答案:

答案 0 :(得分:1)

你错过了正则表达式中的g标志。这将允许多重匹配。

这就是你想要的

Array.prototype.push.apply( adBookmarkletData
              , document.innerHTML.match( /place_ad_here\('[^']+'\)/g ) ) ;
如果您使用全局 g 标志,

string.match将返回所有匹配的数组。 此外,由于push只接受参数列表,因此使用apply来传递参数。

答案 1 :(得分:1)

请注意,soitgoes和Laurent都推荐或使用文字正则表达式分隔符(//)。您的RegExp不工作b / c您正在转义传递给RegExp构造函数的字符串中的括号。你需要双倍逃脱它们。

new RegExp("place_ad_here\\('(.*?)'\\)","g")

这就是为什么我喜欢文字正则表达式而在我需要在运行时构造正则表达式时使用RexExp。

除此之外,劳伦特的答案应该达到你想要的效果。他只是使用了略微不同的正则表达式。 [^'] + vs.(。*)?两者都适用于您所描述的文本。

如果你想在结尾处使用换行符保持输出(每行1个),你可以使用替换而不是匹配并相应地调整你的正则表达式。

最后一点:如果像

这样的输入,你的匹配和/或替换会变得更复杂

<script type="text/javascript">yld_mgr.place_ad_here('A728');</script>

跨越多行place_ad_here只需要一个参数,因此请确保您知道输入的所有可能变体。 :)

答案 2 :(得分:0)

我相信你拥有它的方式只会匹配第一场比赛...我相信你需要做这样的事情..

while ( var match = myRegExp.exec(document.innerHTML)){
   adBookmarkletData.push(match);
}