-1

所以可以说我的文字是:

 <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*?\<来抓住其他人,但它不会起作用

4

4 回答 4

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 <
于 2012-12-25T18:24:09.313 回答
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]);
?>

对我来说很好。

于 2012-12-25T18:25:04.903 回答
0

只需选择跨度内的所有内容很简单:<span>([^<]*)<\/span>

让我知道这是否适合您。

如果您只想要价格:<span>[^$<]*(\$\d+)[^<]*<\/span>应该可以

于 2012-12-25T18:22:15.523 回答
0

我不会为此使用正则表达式。如果您向 div 添加一个 id,您可以使用 DOM 工具轻松获取 spans 文本:

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();
});

如果模式不是唯一的,那么您可能不得不使用正则表达式...

于 2012-12-25T18:36:03.533 回答