2009-05-22 4 views
1

私はpaternのhtmlページを解析する必要があります。私は一致が配列に読み込まれると仮定しています。そして、私は配列の内容を出力する必要があります。RegEx - パターンのhtmlページを解析する方法(JavaScript)

<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パターンは、サンプルコードに対してオンラインテスタで動作します。しかし、ここでの結果はnullです。 私は、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') 

かなり多く、私はそれらを表示する方法です。

事前のおかげで...

答えて

0

私はあなたはそれが唯一の最初の試合と一致します持っている方法は...私はあなたがこのような何かをする必要があると考えていると信じて...

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

また、JavaScriptではコンストラクタの代わりにRegExデリミタを使用できます。 新しいRegexp()の代わりに/place_ad_here\('(.*??????????? –

+0

)だから、私はソイゴーズの提案を試みました。しかし、喜びはありません。それは私に構文エラーを与える。 var myRegExp = new RegExp( "place_ad_here \( '(。*?)' \)"); while(var match = myRegExp.exec(document.innerHTML)){adBookmarkletData.push(match); }; –

+0

申し訳ありませんが、私は例を実行しませんでした。構文エラーが何であれ修正して何が起こるか確認してください –

1

あなたは」 Regexでgフラグが見つからない。これにより、複数の一致が可能になります。

は、これは、あなたがグローバルグラムフラグを使用する場合

Array.prototype.push.apply(adBookmarkletData 
       , document.innerHTML.match(/place_ad_here\('[^']+'\)/g)) ; 

string.matchは、すべてのマッチの配列を返します欲しいものです。 また、pushは引数のリストのみを受け入れるので、applyを使用してargsを渡します。

1

soitgoesとLaurentの両方がリテラル正規表現デリミタ(//)を使用することをお勧めします。 RegExpコンストラクタに渡される文字列内のかっこをエスケープしている場合、RegExpは動作していません。それらを二重にエスケープする必要があります。

私は、実行時に私の正規表現を構築する必要があるとき、私はリテラル正規表現と のみ使用RexExpを好む理由です
new RegExp("place_ad_here\\('(.*?)'\\)","g") 

ローランの答えはあなたが望むものを達成するはずです。彼はわずかに異なる正規表現を使用しています。 [^ '] +対(。*)?どちらも、あなたが記述しているテキストのために働くはずです。

最後に改行(1行に1つ)を付けて出力を維持したい場合は、matchの代わりにreplaceを使用して、それに応じて正規表現を調整することができます。

最後の注意:

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

のような入力がそう、またはplace_ad_hereが今までメートル鉱石よりも一つのパラメータを取る複数行にわたる場合、あなたのマッチングおよび/または交換がより複雑になり、入力の可能なすべてのバリエーションを知っていることを確認してください。:)

関連する問題