【问题标题】:PHP Regular Expression that returns array of matches (preg_match vs preg_match_all)返回匹配数组的 PHP 正则表达式(preg_match vs preg_match_all)
【发布时间】:2018-03-30 11:37:29
【问题描述】:

我正在尝试获取我的正则表达式的所有成功匹配的数组,在本例中是所有数据 URI 的数组,以便遍历数组并将每个数据 URI 转换为文件。

<?php
$string = '<img src="data:image/png;base64,FAKEIMAGE0XXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 0" /><img src="data:image/png;base64,FAKEIMAGE1XXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 1" /><img src="data:image/png;base64,FAKEIMAGE2XXXXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 2" /><img src="data:image/png;base64,FAKEIMAGE3XXXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 3" />';
$pattern = '@src="([^"]+)"@';
echo preg_match($pattern, $string, $matches, PREG_OFFSET_CAPTURE);
var_dump($matches);

我想要如下结果:

 Array(4) { [0]=> string(60) "data:image/png;base64,FAKEIMAGE0XXXXXAKJDBFLASDGFSDGAFJLSD==" [1]=> string(60) "data:image/png;base64,FAKEIMAGE1XXXXXAKJDBFLASDGFSDGAFJLSD==" [2]=> string(62) "data:image/png;base64,FAKEIMAGE2XXXXXXXAKJDBFLASDGFSDGAFJLSD==" [3]=> string(61) "data:image/png;base64,FAKEIMAGE3XXXXXXAKJDBFLASDGFSDGAFJLSD==" }

【问题讨论】:

标签: php arrays regex


【解决方案1】:

您可以使用DOMDocument 并找到带有getElementsByTagName 的图像,而不是使用regex to parse html

$string = '<img src="data:image/png;base64,FAKEIMAGE0XXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 0" /><img src="data:image/png;base64,FAKEIMAGE1XXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 1" /><img src="data:image/png;base64,FAKEIMAGE2XXXXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 2" /><img src="data:image/png;base64,FAKEIMAGE3XXXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 3" />';
$dom = new DOMDocument();
$dom->loadHTML($string);
$srcs = [];
foreach ($dom->getElementsByTagName('img') as $img) {
    $srcs[] = $img->getAttribute("src");
}
var_dump($srcs);

Demo

【讨论】:

  • 加一个用于建议 DOMDocument。我也会这样做,而不是使用正则表达式。
【解决方案2】:

用以下代码重写代码解决了获取分配给$matches的结果数组的问题:

$string = '<img src="data:image/png;base64,FAKEIMAGE0XXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 0" /><img src="data:image/png;base64,FAKEIMAGE1XXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 1" /><img src="data:image/png;base64,FAKEIMAGE2XXXXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 2" /><img src="data:image/png;base64,FAKEIMAGE3XXXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 3" />';
$pattern = '@src="([^"]+)"@';
echo preg_match_all($pattern, $string, $matches, PREG_OFFSET_CAPTURE);
var_dump($matches[1]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多