Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.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抓取标记,检查图像是否存在并替换不存在的路径?_Php - Fatal编程技术网

如何使用PHP抓取标记,检查图像是否存在并替换不存在的路径?

如何使用PHP抓取标记,检查图像是否存在并替换不存在的路径?,php,Php,我有一些标记,需要对图像进行爬网,并检查图像是否存在于它们指定的路径中。如果位置A中不存在图像,则应将路径替换为位置B 我想知道实现这一点最有效的方法是什么?您可以在这里使用正则表达式。创建一个正则表达式以匹配 您必须提供ImageExists()函数和正确的正则表达式。您可以在此处使用正则表达式。创建一个正则表达式以匹配 您必须提供ImageExists()函数和正确的正则表达式。使用PHP的。它很容易使用。下面是一个例子(可能不起作用,但你知道了): 使用PHP的。它很容易使用。下面是一个

我有一些标记,需要对图像进行爬网,并检查图像是否存在于它们指定的路径中。如果位置A中不存在图像,则应将路径替换为位置B


我想知道实现这一点最有效的方法是什么?

您可以在这里使用正则表达式。创建一个正则表达式以匹配


您必须提供
ImageExists()
函数和正确的正则表达式。

您可以在此处使用正则表达式。创建一个正则表达式以匹配

您必须提供
ImageExists()
函数和正确的正则表达式。

使用PHP的。它很容易使用。下面是一个例子(可能不起作用,但你知道了):


使用PHP的。它很容易使用。下面是一个例子(可能不起作用,但你知道了):




(相关)是您的标记还是您为什么需要这样做?为什么不能在生成标记之前检查图像是否存在?因为标记不是由PHP生成的,它是手工编写的。标记由PHP抓取,然后在另一个位置运行,因此图像路径不同。我不想使用绝对路径或只是更改每个路径的原因是,我希望在应用程序的基础上保留图像的简单“重载”;如果应用程序没有图片X,则将路径重定向到公共位置,所有默认图片都在该位置。(相关)是您的标记还是您为什么需要这样做?为什么不能在生成标记之前检查图像是否存在?因为标记不是由PHP生成的,它是手工编写的。标记由PHP抓取,然后在另一个位置运行,因此图像路径不同。我不想使用绝对路径或只是更改每个路径的原因是,我希望在应用程序的基础上保留图像的简单“重载”;如果应用程序没有图片X,则将路径重定向到公共位置,其中包含所有默认图片。他可以使用文件\u get\u contents($image\u url)检查文件是否存在。谢谢!我完全忘记了多姆。我比SimpleXML更多地使用它,但我在几个月的时间里放弃了编写PHP。我希望他们能为最好的DOM解析器选择一个更吸引人的名字……啊。DOM文档似乎正是我需要的!除了DOMDocument在那里填充DOCTYPE、html和body标记,当我只加载文档片段时。。。然后,标记被JSON编码到文档中并传输到请求的客户端,在许多情况下,这会使标记有效负载增加一倍(当标记非常简单时),这并不是很好,特别是当应用程序针对移动使用时,每个字节都很重要。通过添加额外的DIV包装器并只获取该DIV的内容,他就可以使用file\u get\u contents($image\u url)来检查文件是否存在。谢谢!我完全忘记了多姆。我比SimpleXML更多地使用它,但我在几个月的时间里放弃了编写PHP。我希望他们能为最好的DOM解析器选择一个更吸引人的名字……啊。DOM文档似乎正是我需要的!除了DOMDocument在那里填充DOCTYPE、html和body标记,当我只加载文档片段时。。。然后,标记被JSON编码到文档中并传输到请求的客户端,在许多情况下,这会使标记有效负载增加一倍(当标记非常简单时),这并不是很好,特别是当应用程序针对移动使用时,每个字节都有计数。通过添加额外的DIV包装器并只获取该DIV的内容的简单方法解决了这个问题。这是不可靠的。如果图像的编写方式与您的模式不完全相同怎么办?我也同意:如果在
src=
之前有
alt=
属性,会发生什么情况?你也必须把它包括进去。。。不过,如果HTML标记在所有文档中都是一致的,这就行了。听起来这正是我需要的。啊!然而,有没有一种方法可以让模式捕获src,即使src之前有alt、id等标记?遗憾的是,对于正则表达式,我自己也没什么用处/@所有人:我说过你必须滚动你自己的正则表达式。这只是一个例子:)这是不可靠的。如果图像的编写方式与您的模式不完全相同怎么办?我也同意:如果在
src=
之前有
alt=
属性,会发生什么情况?你也必须把它包括进去。。。不过,如果HTML标记在所有文档中都是一致的,这就行了。听起来这正是我需要的。啊!然而,有没有一种方法可以让模式捕获src,即使src之前有alt、id等标记?遗憾的是,对于正则表达式,我自己也没什么用处/@所有人:我说过你必须滚动你自己的正则表达式。这只是一个例子:)
$htmlContent = Preg_Replace_Callback (
    '/<img src="(.*)"/is',
    function ( $matches ) {
        if ( ImageExists ( $matches[1] ) )
            return $matches[1];
        else
            return '/path/to/some/other/image.jpg';
    },
    $htmlContent
);
<?php

$document = simplexml_load_file('dah_file.html');

foreach ($document->children() as $child)
{
  if !file_exists($child['src'])
  {
    $child['src'] = 'path/to/image.png';
  }
}

print($document->asXml());

?>