不要在 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');
}
Edit:
您正在使用wpautop
清理描述的功能。
根据文档,它需要The text to be formatted.
作为第一个参数。
因此,首先确保它确实保留了参数内的图像标签。
我假设标签被保留。看看正则表达式本身,我发现它的匹配太少了。
你正在匹配.*?
在捕获组内。这?
表示使用惰性匹配,即根据需要匹配尽可能少的字符。
所以.*
将匹配任何字符,零个或多个。和?
将根据需要匹配尽可能少的数量。
在我的输出中var_dump
for $match
我看到它找到了匹配项。
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 进行测试的,对于较新的版本可能会有所不同!