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标签并打印开始和结束标签之间的文本,即:“State bank of America”和“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”或两者都打印怎么办。

如何打印它在页面中遇到的最后一个标签的内部文本,或者它如何打印所有标签?

提前致谢。

编辑:上面的文档本身是一个 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 DETAILS>>>>> Retirement Program (Profit-Sharing Retirement Plan (PSRP) and Money Purchase Pension Plan (MPPP)),Retirement Program (Profit-Sharing Retirement Plan (PSRP) and Money Purchase Pension Plan (MPPP)),Retirement计划(利润分享退休计划(PSRP)和货币购买养老金计划(MPPP))

这又是因为相同的 XML 在页面中出现了 3 次,而我想要的是正则表达式只匹配最后一个 XML,我也不想要标签名称。

所以我想要的输出是:

XML DETAILS>>>>> 退休计划(利润分享退休计划(PSRP)和货币购买养老金计划(MPPP))

4

4 回答 4

1

DOMParser.parseFromString如果完整的 XML 字符串有效,您可以使用以下方法将其解析为 XML 文档:

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

然后可以直接获取指定名称的标签列表:

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

这是一个使用您提供的 XML的jsFiddle 示例root,有两个小的调整——我必须为第一个添加一个元素和一个开始标记site

于 2013-10-23T08:41:44.310 回答
1

像这样的正则表达式模式:<accountName>(.*?)<\/accountName>

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

=> testRE 包含您的所有匹配项,如果 tag=accountName 它包含“美国国家银行”和“rahukk”

更新

根据此页面接收所有匹配项,而不仅仅是第一个匹配项,您必须在匹配模式中添加一个“g”标志。

“g:全局搜索标志使正则表达式在整个字符串中搜索模式,创建一个它可以找到与给定模式匹配的所有匹配项的数组。” 在这里找到

希望这对你有帮助!

于 2013-10-23T07:12:11.387 回答
1

你的匹配方法不是全局的。

var regex = new RegExp(a+"(.*)"+b, "g");
text.match(regex);
于 2013-10-23T07:12:18.867 回答
0

您的任务不需要正则表达式(此外,请阅读RegEx match open tags except XHTML self-contained tags,了解为什么这不是一个好主意!)。您可以通过 javascript 完全做到这一点:

var tag = "section";
var targets = document.getElementsByTagName(tag);
for (var i = targets.length; i > 0; i--) {
    console.log(targets[i].innerText);
}
于 2013-10-23T08:03:56.017 回答