JavaScript正则表达式替换,多行匹配

3

我有一些文本内容(使用jQuery从HTML中读取),看起来像以下这些例子中的任何一个:

<span>39.98</span><br />USD

或者可以通过额外付费跨越多行,例如:

<del>47.14</del>

    <span>39.98</span><br />USD
这些数字的格式可能是:
  • 1,234.99
  • 1239,99
  • 1 239,99
等等(即不仅仅是一个普通的十进制数)。 我想做的是只获取内部的任何值。 到目前为止,这就是我想出来的,但我遇到了多行方法的问题,而且有可能有两个数字,我想忽略第一个数字。 我已经尝试过使用^和$以及“m”多行修改符的变化,但没有成功。
var strRegex = new RegExp(".*<span>(.*?)</span>.*", "g");

var strPrice = strContent.replace(strRegex, '$1');

如果有一种方法可以针对字符串中的span标签进行定位(即此时我们没有处理DOM),那么我可以在这里使用jQuery。

4个回答

2
您可以先从字符串中删除所有换行符,然后再运行您的正则表达式:
strContent = strContent.replace(/(\r\n|\n|\r)/gm,"");
var strRegex = new RegExp(".*<span>(.*?)</span>.*", "g");
var strPrice = strContent.replace(strRegex, '$1');

2

使用jQuery非常容易。只需将您的HTML字符串包装在一个div中,然后像往常一样使用jQuery:

var myHTML = "<span>Span 1 HTML</span><span>Span 2 HTML</span><br />USD";
var $myHTML = $("<div>" + myHTML + "</div>");

$myHTML.find("span").each(function() {
   alert($(this).html()); 
});

这里是一个可用的fiddle示例


1
尝试使用。
"[\s\S]*<span>(.*?)</span>[\s\S]*"

而不是

".*<span>(.*?)</span>.*"

编辑:由于您使用字符串来定义正则表达式,请不要忘记转义反斜杠,因此

[\s\S] 

会是

[\\s\\S]

所有回答都很好,但是你的回答最接近我想要的,并且它运行得很好,谢谢! - duncan
为什么第二个字符集[.\s\S]包含了.?只使用[\s\S]似乎也可以。 - duncan
@duncan,那是个打字错误。现在正在修复。 - joelmdev

1
你需要这个吗?
var str = "<span>39.98</span><br />USD\n<del>47.14</del>\n\n<span>40.00</span><br />USD";

var regex = /<span>([^<]*?)<\/span>/g;

var matches = str.match(regex);

for (var i = 0; i < matches.length; i++)
{
    document.write(matches[i]);
    document.write("<br>");
}

在这里测试: http://jsfiddle.net/9LQGK/

matches 数组将包含匹配项。但是你想要什么并不是很清楚。什么意思是 there's potentially two numbers and I want to ignore the first one


我想要<span></span>中的数字,但我不想要<del></del>中的数字。 - duncan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,