如何使用preg_match函数获取span标记内容?

Ash*_*art 1 php preg-match

我有以下HTML代码:

<span role="button" class="a-n S1xjN" tabindex="0">414,817 people</span>
Run Code Online (Sandbox Code Playgroud)

如何使用 preg_match函数来获取414817数字?

Ama*_*ali 6

更好的解决方案

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

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

$dom = new DOMDocument;
$dom->loadHTML($yourHTMLString);
$result = $dom->getElementsByTagName('span')->item(0)->nodeValue;
Run Code Online (Sandbox Code Playgroud)

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

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

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

// 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, ' ');
Run Code Online (Sandbox Code Playgroud)

所有这些陈述都将输出414,817.您可以使用大量的字符串函数,您可以选择一种适合您需求的解决方案.

基于Regex的解决方案

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

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

[^<>]*意味着" 匹配任意数量的字符,但有角度的括号 ",确保我们不会意外地突破我们所处的标记.

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

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