обнаружение нескольких тегов HTML с помощью JavaScript и регулярных выражений

0

Я создаю расширение chrome, которое будет читать текущую страницу и обнаруживать определенные теги html/xml:

Например, если моя текущая страница содержит следующие теги или данные:

some random text here and there

<investmentAccount acctType="individual" uniqueId="1629529524">
<accountName>state bank of america</accountName>
<accountHolder>rahul raina</accountHolder>
<balance balType="totalBalance">
<curAmt curCode="USD">516545.84</curAmt>
</balance>
<asOf localFormat="MMM dd, yyyy">2013-08-31T00:00:00</asOf>
<holdingList>
<holding holdingType="mutualFund" uniqueId="-2044388005">
<description>Active Global Equities</description>
<value curCode="USD">159436.01</value>
</holding>
<holding holdingType="mutualFund" uniqueId="-556870249">
<description>Passive Non-US Equities</description> 
<value curCode="USD">72469.76</value>
</holding>
</holdingList>
<transactionList/>
</investmentAccount>
</site>
some data 123

<site name="McKinsey401k">
<investmentAccount acctType="individual" uniqueId="1629529524">
<accountName>rahuk</accountName>
<accountHolder>rahuk</accountHolder>
<balance balType="totalBalance">
<curAmt curCode="USD">516545.84</curAmt>
</balance>
<asOf localFormat="MMM dd, yyyy">2013-08-31T00:00:00</asOf>
<holdingList>
<holding holdingType="mutualFund" uniqueId="1285447255">
<description>Special Sits. Aggr. Long-Term</description>
<value curCode="USD">101944.69</value>
</holding>
<holding holdingType="mutualFund" uniqueId="1721876694">
<description>Special Situations Moderate $</description>
<value curCode="USD">49444.98</value>
</holding>
</holdingList>
<transactionList/>
</investmentAccount>
</site>

Поэтому мне нужно определить say tag и распечатать текст между начальным и конечным тегом, то есть: "Государственный банк Америки" и "rahukk",

Вот что я сделал до сих пор:

    function countString(document_r,a,b) {
var test = document_r.body; 
var text = typeof test.textContent == 'string'? test.textContent : test.innerText; 
var testRE = text.match(a+"(.*)"+b);
return testRE[1];

}



chrome.extension.sendMessage({
    action: "getSource",
    source: "XML DETAILS>>>>>"+"\nAccount name is: " +countString(document,'<accountName>','</accountName>')
});

Но это только печатает внутренний текст только первого тега, который он встречает на странице, то есть "Государственный банк Америки".

Что делать, если я хочу напечатать только "rahukk", который является внутренним текстом последнего тега на странице или и тем, и другом.

Как распечатать внутренний текст последнего тега, который он встречает на странице, или как он печатает все теги?

Заранее спасибо.

EDIT: документ сам по себе является HTML-страницей, на которой я только что разместил содержимое страницы

ОБНОВЛЕНИЕ: Так что я сделал кое-что здесь и там из приведенных ниже предложений и лучшего, что я мог бы достичь по этому коду:

function countString(document_r) {


var test = document_r.body; 
var text = test.innerText; 

var tag = "accountName";
var regex = "<" + tag + ">(.*?)<\/" + tag + ">";
var regexg = new RegExp(regex,"g");
var testRE = text.match(regexg);
return testRE;
}

chrome.extension.sendMessage({
    action: "getSource",
    source: "XML DETAILS>>>>>"+"\nAccount name is: " +countString(document)
});

Но это дало мне:

XML ДЕТАЛИ >>>>> Программа выхода на пенсию (Пенсионный план с выплатой прибыли (PSRP) и Пенсионный план для денежных выплат (MPPP)), Программа выхода на пенсию (Пенсионный план распределения прибыли (PSRP) и Пенсионный план для денежных выплат (MPPP)), Пенсионный Программа (Пенсионный план распределения прибыли (PSRP) и Пенсионный план денежных выплат (MPPP))

Это опять же потому, что один и тот же XML присутствовал на странице 3 раза, и я хочу, чтобы регулярное выражение соответствовало только последнему XML, и я тоже не хочу, чтобы имена тегов.

Поэтому мой желаемый результат:

XML DETAILS >>>>> Программа выхода на пенсию (Пенсионный план распределения прибыли (PSRP) и Пенсионный план для покупки денег (MPPP))

  • 0
    Есть ли конкретная причина, по которой вы не хотите использовать getElementsByTagName ?
Теги:
google-chrome-extension

4 ответа

1

Если полная XML-строка действительна, вы можете проанализировать ее в XML-документе, используя метод DOMParser.parseFromString:

var xmlString = '<root>[Valid XML string]</root>';
var parser = new DOMParser();
var doc = parser.parseFromString(xmlString, 'text/xml');

Затем вы можете получить список тегов с указанным именем напрямую:

var found = doc.getElementsByTagName('tagName');

Здесь пример jsFiddle с использованием предоставленного вами XML с двумя небольшими изменениями - мне пришлось добавить root элемент и открывающий тег для первого site.

  • 0
    Джордан, это действительно очень хороший подход, но, как я уже сказал, мой полный документ содержит много других вещей, кроме этого только XML. :(
  • 0
    @ rahul888 Эй, понятно. :( Не могли бы вы опубликовать анонимный пример полного документа?
Показать ещё 6 комментариев
1

Регулярный шаблон <accountName>(.*?)<\/accountName> следующим образом: <accountName>(.*?)<\/accountName>

var tag = "accountName";
var regex = "<" + tag + ">(.*?)<\/" + tag + ">";
var testRE = text.match(regex);

=> testRE содержит все ваши совпадения, в случае тега = accountName он содержит "государственный банк америки" и "рахукк",

ОБНОВИТЬ

Согласно этой странице, чтобы получать все совпадения, вместо первого, вы smust добавляете флаг "g" в шаблон соответствия.

g: Глобальный флаг поиска делает поиск RegExp шаблоном во всей строке, создавая массив всех вхождений, которые он может найти, соответствующий данному шаблону ". найдено здесь

Надеюсь, это поможет вам!

  • 0
    извини не понял тебя :(
  • 0
    я пытался обновить свой ответ @ rahul888
Показать ещё 3 комментария
1

метод совпадения не является глобальным.

var regex = new RegExp(a+"(.*)"+b, "g");
text.match(regex);
  • 0
    Вы имели в виду: test.innerText ???
  • 0
    Да ... Вы сопоставляете текстовое содержимое, которое не содержит тегов.
Показать ещё 6 комментариев
0

Вам не нужны регулярные выражения для вашей задачи (кроме того, читайте теги RegEx, которые открывают теги, за исключением тегов XHTML, для которых это не очень хорошая идея!). Вы можете сделать это полностью через javascript:

var tag = "section";
var targets = document.getElementsByTagName(tag);
for (var i = targets.length; i > 0; i--) {
    console.log(targets[i].innerText);
}
  • 0
    Я думаю, что это не работает, потому что на самом деле я работаю не с документом XHTML, а с дампом, который, вероятно, является строкой. Хотя смущен
  • 0
    Нет никаких проблем. Вы можете создать элемент на основе вашей строки и выполнить эту логику там же. И если это не работает, вам все равно не следует делать это с помощью регулярных выражений, а вместо этого использовать парсер XML / HTML.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню