从可能包含无效 HTML 的字符串中提取 <img> src 值

问题描述 投票:0回答:3

我在 PHP 中有一个如下所示的变量。

$content = 'abc def <img src="https://www.example.com/images/abc.png" /> end';

我必须使用正则表达式删除除 img 标签的 src 值之外的所有内容。所以最终的值:

$content = 'https://www.example.com/images/abc.png';

我在 Java 中有正则表达式可以做到这一点,但我必须在 PHP 中做到这一点,但我无法做到。

Java代码:

Pattern p = Pattern.compile("<img[^>]*src=[\\\"']([^\\\"^']*)");
Matcher m = p.matcher(content);
while (m.find()) {
    String src = m.group();
    int startIndex = src.indexOf("src=") + 5;
    content = src.substring(startIndex, src.length());
    break; // break after first image is found
}

我该怎么做?

php regex src text-extraction text-parsing
3个回答
2
投票

如果可以选择,请避免使用正则表达式来解析 HTML 数据。在这种情况下,HTML 解析器更安全:

$dom = new domDocument;
$dom->preserveWhiteSpace = false;
$dom->loadHTML($content);

$imgs = $dom->getElementsByTagName('img');
$srcs = array();

for ($i = 0; $i < $imgs->length; ++$i) {
    $srcs[] = $imgs->item($i)->getAttribute('src');
}

如果您确定存在且仅有一个

img
标签,您可以按照以下步骤操作:

// ...
$content = $dom->getElementsByTagName('img')->item(0)->getAttribute('src');

0
投票

快到了。如果只需要第一张图像,如代码所示,您可以像这样使用

preg_match()

<?php
$re = '/<img[^>]*src=[\\\"\']([^\\\"^\']*)/i';
$str = 'abc def <img src="https://www.example.com/images/abc.png" /> end';
preg_match($re, $str, $matches);
echo $matches[1];

演示


0
投票

在 PHP 中是完全一样的。 我用 regex101.com

生成了代码
$re = '/<img[^>]*src=[\\\\\"\']([^\\\\\"^\']*)/';
$str = 'abc def <img src="https://www.example.com/images/abc.png" /> end';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);
© www.soinside.com 2019 - 2024. All rights reserved.