我想知道这是如何实现的。
假设:有很多包含表格、div、图像等的 html 代码。
问题:如何获得所有匹配项。此外,具体来说,如何获取 img 标签源(src =?)。
例子:
<img src="http://example.com/g.jpg" alt="" />
如何打印出 http://example.com/g.jpg在这种情况下。我想假设我提到的 html 代码中还有其他标签,并且可能不止一张图片。是否可以在 html 代码中包含所有图像源的数组?
我知道这可以通过正则表达式来实现,但我无法掌握它。
非常感谢任何帮助。
最佳答案
虽然正则表达式适用于各种各样的任务,但我发现它在解析 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*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>
然后,如果出现以下情况,上述操作可能会失败:
- 属性或标签名称大写,
i
不使用修饰符。 - 不在
src
周围使用引号属性。 - 然后是另一个属性
src
使用>
角色在他们的值(value)中的某个地方。 - 一些我没有预见到的其他原因。
所以再说一次,不要使用正则表达式来解析 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;
}
关于php - 使用正则表达式从 html 代码中提取第一个图像源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1196570/