虽然正则表达式可以适用于各种各样的任务,但我发现解析HTML DOM时通常会很短。 HTML的问题是,您的文档的结构是如此变量,很难准确(并且准确地说,我的意思是100%的成功率,没有假阳性)提取标签。
我建议你做的是使用DOM解析器,如SimpleHTML,并使用它:
function get_first_image($html) {
require_once('SimpleHTML.class.php')
$post_html = str_get_html($html);
$first_img = $post_html->find('img', 0);
if($first_img !== null) {
return $first_img->src;
}
return null;
}
有些人可能认为这是过度的,但最终会更容易维护,并且还可以实现更多的扩展性。例如,使用DOM解析器,我也可以获取alt属性。
可以设计正则表达式以实现相同的目标,但是将受到限制,使得它将强制alt属性在src之后或相反的情况下,并且克服该限制将给正则表达式增加更多的复杂性。
另外,请考虑以下内容。要正确匹配< img>标记使用正则表达式并仅获取src属性(在组2中捕获),您需要以下正则表达式:
]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>
然后,如果:
>属性或标签名称在资本中,而i修饰符不被使用。
> src属性周围没有使用行情。
>另一个属性然后src使用>人物的价值在某处。
还有一些其他原因我没有预见到。
所以再一次,根本不用正则表达式来解析dom文件。
编辑:如果你想要所有的图像:
function get_images($html){
require_once('SimpleHTML.class.php')
$post_dom = str_get_dom($html);
$img_tags = $post_dom->find('img');
$images = array();
foreach($img_tags as $image) {
$images[] = $image->src;
}
return $images;
}