当有空格时,preg_match_all正则表达式失败

时间:2014-10-12 00:15:48

标签: php regex whitespace

我试图使用以下正则表达式从html源代码获取图像网址,但是当图片网址中包含空格时,它会失败。例如,这个网址:

<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配置中设置的东西?

1 个答案:

答案 0 :(得分:1)

您的正则表达式有几个问题。

首先,您尝试使用连接运算符('.')将表达式的两个部分连接在一起(这不是必需的)。其次,您不需要在角色类中使用交替运算符|

.将匹配除换行序列之外的任何字符。这些标记可能包含换行符,因为它们位于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);