Php 使用preg\u match\u all从字符串中提取img src

Php 使用preg\u match\u all从字符串中提取img src,php,regex,html-parsing,preg-match-all,Php,Regex,Html Parsing,Preg Match All,我已经尝试使用preg_match_all 30分钟了,但看起来我做不到 基本上我有一个$var,它包含一个HTML代码字符串。例如: <br>iihfuhuf <img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"> <img src="http://www.

我已经尝试使用preg_match_all 30分钟了,但看起来我做不到

基本上我有一个$var,它包含一个HTML代码字符串。例如:

<br>iihfuhuf
<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"   
 src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg">
<img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>
获取src值并将其另存为匹配项

/temp/temp[a-z0-9]{13}\.jpeg是src值的过滤器

对于快速正则表达式测试,请使用一些在线工具,如

获取src值并将其另存为匹配项

/temp/temp[a-z0-9]{13}\.jpeg是src值的过滤器

对于快速正则表达式测试,请使用一些在线工具,如

尝试以下方法:

preg_match_all('/src="([^"]+temp[a-z0-9]{13}\.jpeg)"/',$url,$matches);

var_dump($matches);
试试这个:

preg_match_all('/src="([^"]+temp[a-z0-9]{13}\.jpeg)"/',$url,$matches);

var_dump($matches);

您只需将另一个组添加到正则表达式中。您可以使用大括号将要从匹配中提取的所有内容包围起来:

preg_match_all('!(<img.*src="(.*/temp/temp[a-z0-9]{13}\.jpeg)"(.*alt=".*")?>)!', $content, $matches);
你可以看到它起作用了。您可以在$matches[2]中找到URL


不过,我要说的是:正则表达式并不是从HTML中提取任何内容的合理方法。您最好使用DOMDocument、XPath或类似的工具。

您需要做的就是向正则表达式中添加另一个组。您可以使用大括号将要从匹配中提取的所有内容包围起来:

preg_match_all('!(<img.*src="(.*/temp/temp[a-z0-9]{13}\.jpeg)"(.*alt=".*")?>)!', $content, $matches);
<?php
$text = '<br>iihfuhuf<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"><img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>';
$pattern = '#src="([^"]+/temp/temp[a-z0-9]{13}\.jpeg)"#';
preg_match_all($pattern, $text, $out);
echo '<pre>';
print_r($out);
?>

Array
(
    [0] => Array
        (
            [0] => src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"
            [1] => src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"
        )

    [1] => Array
        (
            [0] => http://www.jlnv2.local/temp/temp513caca536fcd.jpeg
            [1] => http://www.jlnv2.local/temp/temp513caca73b8da.jpeg
        )

)
你可以看到它起作用了。您可以在$matches[2]中找到URL

不过,我要说的是:正则表达式并不是从HTML中提取任何内容的合理方法。您最好使用DOMDocument、XPath或类似的工具。

下面是一个基于DOMDocument/DOMDxpath的示例,介绍如何使用它。这可以说是唯一正确的方法,因为除非你真的擅长正则表达式,否则很可能总是有一些边缘情况会破坏你的逻辑

<?php
$text = '<br>iihfuhuf<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"><img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>';
$pattern = '#src="([^"]+/temp/temp[a-z0-9]{13}\.jpeg)"#';
preg_match_all($pattern, $text, $out);
echo '<pre>';
print_r($out);
?>

Array
(
    [0] => Array
        (
            [0] => src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"
            [1] => src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"
        )

    [1] => Array
        (
            [0] => http://www.jlnv2.local/temp/temp513caca536fcd.jpeg
            [1] => http://www.jlnv2.local/temp/temp513caca73b8da.jpeg
        )

)
下面是一个基于DOMDocument/DOMXPath的示例,介绍如何执行此操作。这可以说是唯一正确的方法,因为除非你真的擅长正则表达式,否则很可能总是有一些边缘情况会破坏你的逻辑


当你试了30分钟后…你想到了什么,还有什么不起作用?预赛$内容:$matches;我真的不明白preg_match_是怎么工作的。我可以使模式正常工作,但不能使preg_match_正常工作。@MarcDupuis您应该使用DOM和XPath,而不仅仅是正则表达式。将HTML加载到包含/temp/temp的和XPath中,您可以轻松迭代匹配的节点,并使用正则表达式提取所需的数据。您甚至可以使用XPath注册PHP函数,以便在XPath查询中直接使用正则表达式。不要使用正则表达式解析HTML。无法使用正则表达式可靠地解析HTML。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用PHP模块正确解析HTML的示例,请参阅。感谢您的建议,但代码是从所见即所得编辑器生成的,我只需要在将图像保存到db之前替换图像的src。所以我想代码永远是我所期望的。不过,谢谢你让我知道DOMDocument。在你尝试了30分钟后…你想出了什么,哪些不起作用?preg_match_all'$内容:$matches;我真的不明白preg_match_是怎么工作的。我可以使模式正常工作,但不能使preg_match_正常工作。@MarcDupuis您应该使用DOM和XPath,而不仅仅是正则表达式。将HTML加载到包含/temp/temp的和XPath中,您可以轻松迭代匹配的节点,并使用正则表达式提取所需的数据。您甚至可以使用XPath注册PHP函数,以便在XPath查询中直接使用正则表达式。不要使用正则表达式解析HTML。无法使用正则表达式可靠地解析HTML。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用PHP模块正确解析HTML的示例,请参阅。感谢您的建议,但代码是从所见即所得编辑器生成的,我只需要在将图像保存到db之前替换图像的src。所以我想代码永远是我所期望的。不过,谢谢你让我知道DOMDocument。你应该转义点\。你也应该转义src=[^]*中的第二个。你应该转义点\。你也应该转义src=[^]中的第二个*