PHP和正则表达式:将网站URL添加到图像

Ben*_*air 1 php regex

我在我的网站上有以下代码.它用于在html块中找到没有http://或/的前面的图像.如果是这种情况,它会将网站网址添加到图像源的前面.

例如:

<img src="http://domain.com/image.jpg"> will stay the same
<img src="/image.jpg"> will stay the same
<img src="image.jpg"> will be changed to <img src="http://domain.com/image.jpg">
Run Code Online (Sandbox Code Playgroud)

我觉得我的代码效率很低......有关如何使用更少代码运行的任何想法?

preg_match_all('/<img[\s]+[^>]*src\s*=\s*[\"\']?([^\'\" >]+)[\'\" >]/i', $content_text, $matches);
if (isset($matches[1])) {
  foreach($matches[1] AS $link) {
    if (!preg_match("/^(https?|ftp)\:\/\//sie", $link) && !preg_match("/^\//sie", $link)) {
      $full_link = get_option('siteurl') . '/' . $link;
      $content_text = str_replace($link, $full_link, $content_text);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

cle*_*tus 6

首先,您可以停止使用正则表达式来处理HTML,特别是当您使用HTML解析器(PHP至少有3个)轻松完成您所做的事情时.例如:

$dom = new DomDocoument;
$dom->loadHTML($html);
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
  $src = $image->getAttribute('src');
  $url = parse_url($src);
  $image->setAttribute('src', http_build_url('http://www.example.com', $url);
}
$html = $dom->saveHTML();
Run Code Online (Sandbox Code Playgroud)

问题解决了.好吧,差不多.您将主机名添加到相对URL而不是以/开头的情况下的情况有点令人费解并且未在此片段中处理,但这是一个相对较小的更改(它涉及检查$url['path']).

解析HTML PHP和DOM中,文档对象模型,parse_url()http_build_url().PHP比正则表达式有更好的工具.

哦,为了好的措施阅读Parsing Html The Cthulhu Way.