我有一些 html 代码并从中提取了 img src 属性。 在 html 字符串中有一些像这样的 img:
<img src="http://www.pecso.it/wp-content/uploads/2016/12/10_WRAS.png">
我已尝试使用以下 PHP 代码执行此操作:
$description = wpautop($this->data->description);
$description = preg_replace("/\[[^\]]+\]/", '', $description);
if (preg_match_all("<img src=(.*?)>", $description, $match)) {
echo match;
};
结果为NULL。
你能帮帮我吗?
最佳答案
不要在 html 上使用正则表达式!
改用 dom 解析器,因为它更简单。
$html = file_get_contents("you_file.html");
$dom = new \DOMDocument();
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$images = [];
foreach ($dom->getElementsByTagName('img') as $image) {
$images[] = $image->getAttribute('src');
}
编辑:
您正在使用 wpautop
函数来清理描述。
根据文档,它需要 The text to be formatted.
作为第一个参数。
因此,首先要确保它确实保留了参数中的图像标签。
因为我假设标签被保留了。查看正则表达式本身,我发现它匹配得太少。
您正在捕获组内匹配 .*?
。 ?
表示使用惰性匹配,即根据需要匹配尽可能少的字符。
所以 .*
将匹配任何字符,零个或多个。 ?
将根据需要匹配尽可能少的内容。
在我为 $match
输出的 var_dump
中,我看到它找到了一个匹配项。
array (size=2) 0 =>
array (size=1)
0 => string 'img src=' (length=8) 1 =>
array (size=1)
0 => string '' (length=0)
然而,第一个匹配组的大小为 0。因为惰性匹配。
我假设内部 php 错误。它应该匹配直到 >
的所有内容,因为这也是正则表达式的一部分。
但似乎 php 忽略了这部分。
如果将捕获组更改为 .+?
,第一组将包含单个 "
字符。因为 +
表示“一个或多个”字符。
解决方案是更改代码,使其包含引号。
if (preg_match_all("<img src=\"(.*?)\">", $description, $match)) {
这与所需的图片链接相匹配:
http://www.pecso.it/wp-content/uploads/2016/12/10_WRAS.png
我建议尝试使用 DOMDocument 方法,因为此代码更有可能更加稳定和可扩展。 如果您想了解正则表达式,解析 html 可能不是最好的开始。
所有这些代码都是使用 php 5.4 测试的,对于较新的版本可能会有所不同!
关于php - 通过 preg_match_all PHP 函数从 html 代码字符串中提取 img 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346921/