Php 正则表达式仅捕获JPG图像

Php 正则表达式仅捕获JPG图像,php,regex,Php,Regex,我有一个PHP正则表达式: $regex = '/<img[^>]*'.'src=[\"|\'](.*)[\"|\']/Ui'; $regex='1!'/ 它捕获字符串中的所有图像标记源,但我只想捕获JPG文件。我曾试图与(.*)混在一起,但我只证明了我在正则表达式方面很差劲。。。现在我正在过滤数组,但感觉太像黑客了,因为我可以直接用一个合适的匹配进行过滤。只需要在我相信的结束引号之前搜索.jpg $regex = '/<img[^>]*'.'src=[\"|\'](.

我有一个PHP正则表达式:

$regex = '/<img[^>]*'.'src=[\"|\'](.*)[\"|\']/Ui';
$regex='1!'/

它捕获字符串中的所有图像标记源,但我只想捕获JPG文件。我曾试图与(.*)混在一起,但我只证明了我在正则表达式方面很差劲。。。现在我正在过滤数组,但感觉太像黑客了,因为我可以直接用一个合适的匹配进行过滤。

只需要在我相信的结束引号之前搜索.jpg

$regex = '/<img[^>]*'.'src=[\"|\'](.*\.jpg)[\"|\']/Ui';

$regex='/您必须小心转义
'
,因为您将它用作PHP delimeter

另外,搜索以
.jpg
jpeg
结尾的文件也会使它成功

$regex = '/<img[^>]*src=["\']([^\'"]*)\.(jpg|jpeg)["\'][^>]*>/Ui';
$regex='/]*>/Ui';
试试这个:

$regex = '/<img ([^>]* )?src=[\"\']([^\"\']*\.jpe?g)[\"\']/Ui';
$regex='1!'/
我还删除了字符类中不需要的额外
|

尝试:

$regex = '/<img[^>]*'.'src=[\"|\'](.*[.]jpg)[\"|\']/Ui';

$regex='/你们都忘记了标签可能在<和img之间有空格

因此,正确的regexp应该从
/首先,使用HTML解析器获取所有
img
标记。然后,取那些其
src
属性值与regex
\(jpeg | jpg)$
匹配的对象

例如,使用:


编辑:我缩短了正则表达式。您还可以使用
\.jpe?g$

什么类型的图像标签?你在筛选什么?一般来说,不可能根据资源的url来判断其内容类型。我通过cURL提取网页,然后搜索标记以获取其源文件。句点*字符只是表示搜索任何字符0次或更多次,直到匹配引号为止。与可能出现的文件扩展名无关!对不起。这是我第一次来这里,我忘了将其作为代码引用。这似乎不起作用,print\r显示数组具有整个标记--“--作为值。抱歉,我只是将.jpg附加到您的代码中,而没有对其进行测试。我做了一些编辑,尽管似乎已经有了一些更好的选择;)。例如,在
..
@Svante:我已经修复了regexp,因此它也与“jpeg”匹配,并且与标记“imgetjpeg”或属性“classrc”不匹配(通过适当添加空格)。
这甚至没有涉及到整个“非常规语言”问题、HTML注释、
区域,嵌入脚本中的字符串等。。将HTML解析留给HTML解析器,这就是他们的工作,他们的工作已经足够多了。@Svante:你在向唱诗班宣讲“不要使用正则表达式解析HTML”。:是的,这只是HTML解析器已经解决的一个小细节。使用一个稳定的HTML解析器是一个更好的方法(即使在某些情况下它可能不是一个选项),谢谢,我会研究它。快速查看一下,它确实使用了fopen,但我已经禁用了fopen,并且测试表明它的可靠性不如cURL。
$html = file_get_html('http://example.foo.org/bar.html');
foreach ($html->find('img') as $img) {
    if (preg_match ("\.(jpeg|jpg)$", $img->src) {
        //save $img or $img->src or whatever you need
    }
}