У меня есть следующий код 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
. Для вас есть целый ряд строковых функций , и вы можете выбрать одно решение, соответствующее вашим требованиям.
Если вы абсолютно должны использовать preg_match()
, вы можете использовать следующее:
if (preg_match('#<span[^<>]*>([\d,]+).*?</span>#', $result, $matches)) { echo $matches[1]; }
[^<>]*
означает « соответствует любому количеству символов, кроме угловых скобок », гарантируя, что мы не случайно вырвемся из тега, в котором мы находимся.
.*?
(обратите внимание на ?
) означает « соответствовать любому количеству символов, но только как можно меньше ». Это позволяет избежать совпадения между первым и последним <span>
в разметке (если имеется несколько <span>
s).
Я не гарантирую, что регулярное выражение всегда будет работать, но этого должно быть достаточно для тех, кто хочет завершить одноразовую работу. В таких случаях, вероятно, лучше пойти с регулярным выражением, которое работает на здравые вещи, чем плакать о вещах, которые не являются универсальными. 🙂