所以我要说的是:
<div>
<span>one something 1 $2502</span><br>
<span>
one something 2
</span><br>
<span>one something 3 $25102
</span><br>
<span>
one something 4 $2102</span><br>
</div>
我正在尝试制作一个能够捕捉到跨度之间所有文本的模式到目前为止我已经设法捕获第一个跨度没问题,但其余的我遇到了麻烦
这是我到目前为止所得到的:
\>(.*?\$\s*?(\d+\.?\d+).*?)\<
我想过使用像\>\r*?\n*?(.*?\$\s*?(\d+\.?\d+).*?)>\r*?\n*?\<
之类的东西来抓住其他东西,但它不起作用
答案 0 :(得分:4)
您不应该使用正则表达式来匹配标记语言;一旦涉及到嵌套标签,事情就会很快变得毛茸茸。也就是说,在你的两个最里面的标签之间只有纯文本的例子中,你可以尝试一下:
>[^<>]*\$\s*(\d+(?:\.\d*)?)[^<>]*<
这将匹配两个>
... <
分隔符之间的任何文本(除非它包含尖括号本身),其中至少包含一个以$
开头的数字。如果它不止一个,它将捕获最后一个。
<强>解释强>
> # Match >
[^<>]* # Match anything besides < or >
\$ # Match $
\s* # Match optional whitespace
( # Match and capture...
\d+ # a number
(?: # possibly followed by:
\.\d* # a dot and optional digits
)? # but make that part optional.
) # End of capturing group
[^<>]* # Match anything besides < or >
< # Match <
答案 1 :(得分:1)
<?php
$string = ' <div>
<span>one something 1 $2502</span><br>
<span>
one something 2
</span><br>
<span>one something 3 $25102
</span><br>
<span>
one something 4 $2102</span><br>
</div>';
preg_match_all('~<span>(.+)</span>~Usi', $string, $matches);
print_r($matches[1]);
?>
对我来说很好。
答案 2 :(得分:0)
只需选择范围内的所有内容即可:<span>([^<]*)<\/span>
请告诉我这是否适合您。
如果您只想要价格:<span>[^$<]*(\$\d+)[^<]*<\/span>
应该有效
答案 3 :(得分:0)
我不会使用正则表达式。如果您向div添加id,则可以使用DOM工具轻松获取跨度文本:
var div = document.getElementById('mydiv');
var text = [].slice.call( div.childNodes ).filter(function( node ){
return node.nodeName == 'SPAN'
}).map(function( span ){ return span.innerText });
console.log( text ); //=> ["one something 1 $2502", "one something 2", "one something 3 $25102", "one something 4 $2102"]
编辑:使用jQuery,你可以做的就是找到一个模式,例如,如果你知道你想要抓住的所有跨度都有一个br
标记,你可以找到它们像这样:
var $spans = $('span').filter(function(){
return $(this).next('br').length
});
var text = $spans.map(function(){
return $(this).text();
});
如果模式不是唯一的,那么你可能必须使用正则表达式...