PHP &

4 Cevap php

Web siteme aşağıdaki aşağıdaki kodu var. Önde / http:// yoksa veya html bir blok görüntüleri bulmak için kullanılır. Bu durumda ise, görüntü kaynağının önüne web sitesi url katacak.

Örneğin:

<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">

Benim kod gerçekten verimsiz olduğunu hissediyorum ... Ben daha az kod ile çalıştırmak yapabilir konusunda herhangi bir fikir?

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);
    }
  }
}

4 Cevap

Başlangıç ​​için ne yaptığınızı kolayca (PHP en az 3 sahip olduğu) bir HTML çözümleyici ile yapılır, özellikle HTML işlemek için düzenli ifadeler kullanarak durdurabilir. Örneğin:

$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.mydomain.com', $url);
}
$html = $dom->saveHTML();

Sorun çözüldü. Evet, hemen hemen. Eğer bağıl URL'ler için değil / ile başlayan olanlar için hostname eklemek durum biraz şaşırtıcı olduğunu ve bu parçasında ele değil ama nispeten küçük bir değişiklik (o $url['path'] kontrol edilmesini içerir) bulunuyor.

Parse HTML With PHP And DOM, Document Object Model, parse_url() and http_build_url() bakın. PHP düzenli ifadeler daha bu çok daha iyi araçlara sahiptir.

Oh ve iyi bir ölçü okuma için Parsing Html The Cthulhu Way.

Belki tamamen farklı bir yaklaşım da, çalışabilir:

<base href="http://domain.com/" />

Düzenli ifadeler ile HTML maç için çalışmak çok zordur.

Kod çalışmıyor gibi görünüyor olsa bile, onlar size tarif ettiğim kesin biçimde değil gibi bazı IMG etiketler kayacak iyi bir şans var.

Bu test değil, ama böyle bir şey düşünüyorum ...

preg_match_all('/<img\b[^>]*\bsrc\s*=\s*[\'"]?([^\'">]*)/i', $content_text, $matches);