1

我有以下 HTML 代码:

<span role="button" class="a-n S1xjN" tabindex="0">414,817 people</span>

如何使用 preg_match函数获取414817号码?

4

1 回答 1

7

更好的解决方案

正则表达式在这里是错误的工具。HTML不是正则语言,使用正则表达式无法准确解析。请改用 DOM 解析器。它不仅更容易,而且更准确可靠,并且在将来标记格式发生变化时不会中断。

这是<span>使用 PHP 的内置DOMDocument类获取标签内内容的方式:

$dom = new DOMDocument;
$dom->loadHTML($yourHTMLString);
$result = $dom->getElementsByTagName('span')->item(0)->nodeValue;

如果有多个标签,并且您想从所有标签中获取节点值,则可以简单地使用foreach循环,如下所示:

$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('span') as $tag) {
    echo $tag->nodeValue . '<br/>';
}

最后,要从节点值中提取数字,您有几个选择:

// Split on space, and get first part
echo explode(' ', $result, 2)[0]; 

// Replace everything that is not a digit or comma
echo preg_replace('/[^\d,]/', '', $result); 

// Get everything before the first space
echo strstr($result, ' ', 1);

// Remove everything after the first space
echo strtok($result, ' ');

所有这些语句都会输出414,817。有大量字符串函数可供您使用,您可以选择一种适合您要求的解决方案。

基于正则表达式的解决方案

如果您绝对必须使用preg_match(),那么您可以使用以下内容:

if (preg_match('#<span[^<>]*>([\d,]+).*?</span>#', $result, $matches)) {
    echo $matches[1];
}

[^<>]*表示“匹配除尖括号之外的任意数量的字符”,确保我们不会意外跳出我们所在的标签。

.*?(注意?)表示“匹配任意数量的字符,但只匹配尽可能少的字符”。这避免了标记中从第一个标记到最后一个<span>标记的匹配(如果有多个<span>s)。

我绝对不保证正则表达式将始终有效,但对于那些想要完成一次性工作的人来说应该足够了。在这种情况下,最好使用适用于理智事物的正则表达式,而不是为事物并非普遍完美而哭泣:)

于 2013-09-17T19:46:57.397 回答