Я пытаюсь получить URL-адреса изображений из исходного кода HTML, используя следующее регулярное выражение, но это не удается, когда URL-адрес изображения содержит пробелы. Например, этот URL:
<img src="http://a57.foxnews.com/global.fncstatic.com/static/managed/img/Entertainment/876/493/kazantsev pink bikini reuters.jpg?ve=1&tl=1" alt="kazantsev pink bikini reuters.jpg" itemprop="image">
$image_regex_src_url = '/<img[^>]*'.'src=[\"|\'](.*)[\"|\']/Ui';
preg_match_all($image_regex_src_url, $string, $out, PREG_PATTERN_ORDER);
Это возвращает мне следующее.
http://a57.foxnews.com/global.fncstatic.com/static/managed/img/Entertainment/876/493/kazantsev
Есть ли способ сопоставить любой символ, включая пробелы? Или это то, что я должен установить в конфигурации php?
У вас есть несколько проблем с вашим регулярным выражением.
Сначала вы пытаетесь использовать оператор конкатенации ('.'
) объединить обе части вашего выражения вместе ( это не обязательно ). Во-вторых, вам не нужно использовать оператор чередования |
внутри ваших классов персонажей.
Точка .
будет соответствовать любому символу кроме последовательности новой строки. Вполне возможно, что эти теги могут включать разрывы строк, поскольку они расположены в исходном коде HTML. Вы могли бы использовать s
модификатор (dotall), который заставляет точку соответствовать любому символу, включая разрывы строк, или использовать отрицательный символьный класс, означающий соответствие любому символу Кроме.
С использованием s
(dotall) модификатор:
$image_regex_src_url = '/<img[^>]*src=(["\'])(.*?)\1/si';
Использование отрицательного класса символов [^ ]
$image_regex_src_url = '/<img[^>]*src=(["\'])([^"\']*)\1/i';
Хотя гораздо проще использовать такой парсер, как DOM чтобы захватить результаты.
$doc = new DOMDocument;
@$doc->loadHTML($html); // load the HTML
foreach($doc->getElementsByTagName('img') as $node) {
$urls[] = $node->getAttribute('src');
}
print_r($urls);
Других решений пока нет …