正则表达式替换 PHP 中的 html src 属性

Posted

技术标签:

【中文标题】正则表达式替换 PHP 中的 html src 属性【英文标题】:Regex to replace html src attribute in PHP 【发布时间】:2012-05-26 08:46:23 【问题描述】:

我正在尝试使用正则表达式替换 php 中的源属性(可以是图像或任何标签)。

我有一个这样的字符串:

$string2 = "<html><body><img src = 'images/test.jpg' /><img src = 'http://test.com/images/test3.jpg'/><video controls="controls" src='../videos/movie.ogg'></video></body></html>";

我想把它变成:

$string2 = "<html><body><img src = 'test.jpg' /><img src = 'test3.jpg'/><video controls="controls" src='movie.ogg'></video></body></html>";

这是我尝试过的:

$string2 = preg_replace("/src=["']([/])(.*)?["'] /", "'src=' . convert_url('$1') . ')'" , $string2);
echo htmlentities ($string2);

基本上它没有改变任何东西,并给了我一个关于未转义字符串的警告。

$1 不发送字符串的内容吗?这里有什么问题?

convert_url 的功能来自我之前在这里发布的一个示例:

function convert_url($url)

    if (preg_match('#^https?://#', $url)) 
        $url = parse_url($url, PHP_URL_PATH);
    
    return basename($url);

应该去掉 url 路径,只返回文件名。

【问题讨论】:

原来的字符串和你想把它变成的都是空字符串——有什么遗漏吗? 你真的不应该用正则表达式解析 HTML。如果您搜索 SO,您应该找到一个非常全面的答案。同时,我可以建议 DOM 或 SimpleXML 我的意思是尝试将正则表达式中的所有“替换为\”,但不是第一个和最后一个 Grabbing the href attribute of an A element 的可能重复项 另外,如果你想使用正则表达式并且想在替换中使用一个函数,你需要preg_replace_callback。你不能像你那样做convert_url('$1'),因为这是在 $1 存在之前评估的。 【参考方案1】:

不要在 HTML 上使用正则表达式 - 使用 DOMDocument 类。

$html = "<html>
           <body>
             <img src='images/test.jpg' />
             <img src='http://test.com/images/test3.jpg'/>
             <video controls='controls' src='../videos/movie.ogg'></video>
           </body>
         </html>";

$dom = new DOMDocument;  
libxml_use_internal_errors(true);

$dom->loadHTML( $html ); 
$xpath = new DOMXPath( $dom );
libxml_clear_errors();

$doc = $dom->getElementsByTagName("html")->item(0);
$src = $xpath->query(".//@src");

foreach ( $src as $s ) 
  $s->nodeValue = array_pop( explode( "/", $s->nodeValue ) );


$output = $dom->saveXML( $doc );

echo $output;

输出如下:

<html>
  <body>
    <img src="test.jpg">
    <img src="test3.jpg">
    <video controls="controls" src="movie.ogg"></video>
  </body>
</html>

【讨论】:

如果 dom 文档类是嵌入在另一个 HTML 标记(如 例如)中的 html,则它不是很有帮助 @Ashesh 我不是我关注的。您向我们展示了 PHP 代码 - 我正在向您展示解决方案。 对不起,我应该更清楚。这就是我所说的:“ ”。在这种情况下,domdocument 不会在 javascript 内的图像标签上拾取。这就是为什么我需要使用正则表达式。 @Ashesh 上面的代码将适用于您在此处提供的 PHP 字符串。它将src 元素转换为仅指向文件名。 有时加载 HTML 解析器不是一个好主意。特别是短的预定义文本值(例如 ),其中只有 src="" 和 可能会有所不同。【参考方案2】:

您必须使用e 修饰符。

$string = "<html><body><img src='images/test.jpg' /><img src='http://test.com/images/test3.jpg'/><video controls=\"controls\" src='../videos/movie.ogg'></video></body></html>";

$string2 = preg_replace("~src=[']([^']+)[']~e", '"src=\'" . convert_url("$1") . "\'"', $string);

请注意,当使用e 修饰符时,替换脚本片段需要为字符串,以防止在调用 preg_replace 之前对其进行解释。

【讨论】:

【参考方案3】:
function replace_img_src($img_tag) 
    $doc = new DOMDocument();
    $doc->loadHTML($img_tag);
    $tags = $doc->getElementsByTagName('img');
    foreach ($tags as $tag) 
        $old_src = $tag->getAttribute('src');
        $new_src_url = 'website.com/assets/'.$old_src;
        $tag->setAttribute('src', $new_src_url);
    
    return $doc->saveHTML();

【讨论】:

什么是 $img_tag ?

以上是关于正则表达式替换 PHP 中的 html src 属性的主要内容,如果未能解决你的问题,请参考以下文章

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

php正则表达式提取img alt/title标签并替换

PHP:正则表达式替换,同时忽略html标签之间的内容

PHP正则匹配替换图片地址

php 正则匹配HTML标签以外的匹配词 并且不匹配A标签中的匹配词

用正则表达式,如何替换<img src="……">中的src地址?