RegEx-как разобрать HTML-страницу для шаблона (в JavaScript) - PullRequest
1 голос
/ 22 мая 2009

Мне нужно разобрать 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 ]

1 голос
/ 23 мая 2009

В вашем регулярном выражении отсутствует флаг g. Это позволит несколько совпадений.

Это то, что вы хотите

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

string.match вернет массив всех совпадений, если вы используете глобальный флаг g . Кроме того, поскольку push принимает только список аргументов, для передачи аргументов применяется apply.

1 голос
/ 24 мая 2009

Обратите внимание, что и soitgo, и Laurent рекомендуют или используют буквенные разделители регулярных выражений (//). Ваш RegExp не работает, потому что вы избегаете скобок в строке, которая передается в конструктор RegExp. Вам нужно будет дважды убежать от них.

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

Именно поэтому я предпочитаю буквальное регулярное выражение, а только использует RexExp, когда мне нужно создать свое регулярное выражение во время выполнения.

Кроме ответа Лорана, вы должны выполнить то, что вы хотите. Он просто использует немного другое регулярное выражение. [^ '] + против (. *)? Оба должны работать для текста, который вы описываете.

Если вы хотите сохранить вывод с символами новой строки в конце (по 1 на строку), вы можете использовать замену вместо совпадения и соответствующим образом изменить регулярное выражение.

Последнее замечание: ваше сопоставление и / или замена становятся более сложными, если ввод типа

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

охватывает более одной строки или place_ad_here когда-либо потребляет м руды, чем один параметр , поэтому убедитесь, что вы знаете все возможные варианты ввода. :)

0 голосов
/ 22 мая 2009

Я полагаю, что то, что у вас есть, будет соответствовать только первому совпадению ... Я считаю, что вам нужно сделать что-то подобное ..

while ( var match = myRegExp.exec(document.innerHTML)){
   adBookmarkletData.push(match);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...