Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何刮取每个li标签的img src值_Php_Regex - Fatal编程技术网

Php 如何刮取每个li标签的img src值

Php 如何刮取每个li标签的img src值,php,regex,Php,Regex,我的preg match语法如下所示: <ul class="vehicle__gallery cf"> <li><a href="#"><img src="AETV19098412_2a.jpg"></a></li> <li><a href="#"><img src="AETV19098412_3a.jpg"></a></li> <li><a h

我的preg match语法如下所示:

<ul class="vehicle__gallery cf">
<li><a href="#"><img src="AETV19098412_2a.jpg"></a></li>
<li><a href="#"><img src="AETV19098412_3a.jpg"></a></li>
<li><a href="#"><img src="AETV19098412_4a.jpg"></a></li>
</ul>
preg\u match\u all('/
    .*?(.*?.*?*?*?/s',$html\u image,$posts,preg\u SET\u ORDER);
您不需要使用正则表达式来解析HTML。它不起作用

  • 标记不总是有结束标记,也不总是有结束标记
  • 一个标记可以有n个属性
  • 属性值并不总是用双引号引起来
使用html解析器,如


我甚至不会为这个问题想出一个正则表达式,因为在某些情况下它会失败。

如果你给你的img标签一个类或什么,例如:

preg_match_all('/<ul class="vehicle__gallery cf">.*?<li>.*?<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>.*?<\/li>.*?<\/ul>/s', $html_image,$posts, PREG_SET_ORDER);

您可以做得更简单:

<img class="gallery_item" src="AETV19098412_2a.jpg">
<img class="gallery_item" src="AETV19098412_3a.jpg">
preg_匹配('/');
然而,这仍然是非常骇客,如果你曾经添加css类,html属性或修改你的代码,你的代码可能不再工作的问题


这个解决方案是干净的,您应该考虑使用JQuery或我之前评论中所述的表单,这将使您的生活更加轻松,并且代码不会因为将来可能出现的html微小更改而中断。

另一种方法是使用javascript(JQuery)

请使用正则表达式来解析HTML。PHP有一个很好的实现,您可以使用它和诸如
//ul/li/a/img/@src
之类的表达式来检索所需内容,或者如果您喜欢该工具集,也可以将其作为对象

例子:
您是否能够使用JavaScript或更好的JQuery?然后,提取所需的数据并通过Ajax传递是一种更简单、更干净的方法,因为这可以工作,但如果您在以后只添加一个参数,或者在html属性之间偶然添加一个空格,则此代码将不再工作。这是一个非常棘手的解决方案。否则,您不能使用表单将图像数据传递给脚本吗?您好,
*
应该是
*?
。尽管有很多情况下正则表达式会失败,但我担心..我说过这是非常危险的,我只是提供了一个基于PHP的解决方案,因为作者要求它。和(*)是正确的,只要没有多余的空格或任何其他属性干扰,它就可以工作。这可以正常工作,但如果OP可以使用jquery,我们需要与他联系。他在使用php(P.s.我没有投反对票)是的,我只是根据我通常的想法给出我的解决方案。。不管怎样,如果他被投下,我将删除我的答案。@Anirudha您的答案
使用类似SimpleDomainParser的html解析器将是一个注释,而不是答案。提供如何使用dom解析器获取
标记内的值的解决方案。@AvinashRaj OP要求一个正则表达式解决方案,其ans为“否”。就解决方案而言,如果他在使用图书馆时遇到任何问题,就让他提出一个新问题。这将是另一个问题,老实说,我不知道PHP你能详细说明你的答案吗?@AvinashRaj,这将是另一个问题,正如我所说。让OP尝试使用图书馆。@Anirudha,我不认为这是另一个问题。他问我如何解析这个html文件并获取特定标记的值。您的答案只是让他使用dom解析器。您需要指导他如何使用dom解析器来实现这一点。一个链接(如果它是SO链接的话就很好)提到这一点(如何使用dom解析器解析特定标记内的文本)会更好。
preg_match('/<img class="gallery_item" src="(.*)">/');
var imgArr = []
$("ul.vehicle__gallery li img").each(function(){
     imgArr.push($(this).attr('src'));
})
$html = <<<HTML
<ul class="vehicle__gallery cf">
<li><a href="#"><img src="AETV19098412_2a.jpg"></a></li>
<li><a href="#"><img src="AETV19098412_3a.jpg"></a></li>
<li><a href="#"><img src="AETV19098412_4a.jpg"></a></li>
</ul>
HTML;

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXpath($dom);
$imgs = $xpath->query("//ul/li/a/img/@src");

foreach ($imgs as $img) {
    echo $img->nodeValue . "\n";
}
AETV19098412_2a.jpg
AETV19098412_3a.jpg
AETV19098412_4a.jpg