当存在空格时,preg_match_all regex将失败


preg_match_all regex fails when there are spaces

我试图使用以下regex从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&amp;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)修饰符来强制点匹配任何字符(包括换行符),或者使用否定字符类来表示匹配除之外的任何字符。

使用sdotall)修饰符:

$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);