首页 > 解决方案 > 正则表达式:Javascript、XML、字符串

问题描述

我在变量中有以下数据。

<ctx>
  <PostCode>XXXXXX</PostCode>
  <Title1>Mr</Title1>
  <Name>John</Name>
  <Order1>£100.00</Order1>
  <Order2>£100.01</Order2>
  <Date>10/10/2010</Date
</ctx>

使用以下正则表达式var payload = ctx.toString().match(/Order[1-9]/g);我得到以下结果

订单 1、订单 1、订单 2、订单 2

我怎样才能让它停在 Order1, Order2 就像计算第二个结束标签一样,我也不能使用<Order[1-9]>(开始标签),因为我的应用程序不允许我捕获标签<>基本上是一个返回唯一值的正则表达式。

所以下面的正则表达式似乎在某种程度上起作用。(Order[0-9])(?!.*\1) (顺序[0-9])(?!.*\1)

https://regex101.com/r/6QhFBg/1

标签: javascriptregexxmlsoap

解决方案


永远不要使用正则表达式解析 XML。 错误的工作工具——导致脆弱的解决方案。

相反,使用真正的 XML 解析器或 XPath。

例如,这个 XPath,

//*[starts-with(local-name(), 'Order')]

将稳健地选择名称以 . 开头的所有元素"Order"

在浏览器的 JavaScript 中,XPath 表达式通过以下方式求值document.evaluate

var orders = document.evaluate('//Order[starts-with(local-name(), 'Order')]', document, 
                               null, XPathResult.ANY_TYPE, null );
var thisOrder = orders.iterateNext();

while (thisOrder) {
  console.log(thisOrder.textContent);
  thisOrder = orders.iterateNext();
}

另请参阅如何使用 document.evaluate() 和 XPath 获取元素列表?

要解析存储在字符串中的 XML,请参见示例:


推荐阅读