Как получить содержимое тега span с помощью функции preg_match?

У меня есть следующий код HTML:

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

Как использовать preg_match для получения номера 414817 ?

Лучшее решение

Регулярное выражение здесь является неправильным инструментом. HTML не является обычным языком и не может быть точно проанализирован с использованием регулярных выражений. Вместо этого используйте парсер DOM. Это не только намного проще, но и более точно и надежно, и не будет нарушаться, когда формат разметки изменится в будущем.

Так вы получите содержимое внутри <span> используя встроенный класс DOMDocument PHP :

 $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 . Для вас есть целый ряд строковых функций , и вы можете выбрать одно решение, соответствующее вашим требованиям.

Решение на основе Regex

Если вы абсолютно должны использовать preg_match() , вы можете использовать следующее:

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

[^<>]* означает « соответствует любому количеству символов, кроме угловых скобок », гарантируя, что мы не случайно вырвемся из тега, в котором мы находимся.

.*? (обратите внимание на ? ) означает « соответствовать любому количеству символов, но только как можно меньше ». Это позволяет избежать совпадения между первым и последним <span> в разметке (если имеется несколько <span> s).

Я не гарантирую, что регулярное выражение всегда будет работать, но этого должно быть достаточно для тех, кто хочет завершить одноразовую работу. В таких случаях, вероятно, лучше пойти с регулярным выражением, которое работает на здравые вещи, чем плакать о вещах, которые не являются универсальными. 🙂