2012-11-19 23 views
8

PHP'de mutlak yollara göre dönüştürmede çok fazla yayın var. Bu mesajların ötesinde özel bir uygulama arıyorum (umarım). Bu özel uygulama konusunda bana yardımcı olabilecek herhangi biri olabilir mi?PHP: Çıktıdaki göreli yol ile görüntüleri ve bağlantıları bulun ve bunları mutlak yola dönüştürün

href s ve göreli URL'ler içeren img s dahil olmak üzere çeşitli HTML içeren bir PHP değişkenim var. Çoğunlukla benim href s değerler ve img ler http://mydomain.com/en/discover ve http://mydomain.com/img/icons/facebook.png

dönüştürülecektir şekilde bu PHP değişkeni işlemek istiyorum /en/discover veya /img/icons/facebook.png

(örneğin) yorganın altına soru inanıyoruz href s için çözüm. Bunu ayrıca img s'yi dikkate almak için nasıl genişletebiliriz?

regex sırayla olabilir mi? Ya da DOMDocument'i kullanmalı mıyız?

+0

Ve' kullanarak olmaz:

Bu doğru döndü? Değilse, o zaman bir regex kullanmanız yeterlidir - aslında 'preg_replace_all' işlevini kullanmanız gerekir. – shadyyx

+0

Cevabınız için teşekkür ederiz. İyi bir öneri, ama sanmıyorum, çünkü çıktı bir XML belgesinde gösterilecek. Sorun regex ile yetersiz olduğum ... – maartenmachiels

cevap

8

Bazı araştırmalardan sonra, Gerd Riesselmann'dan RSS beslemeleri için bir base href çözümünün nasıl çözüleceğine dair bu makaleye rastladım. Onun snippet sorumu gerçekten çözer!

<?php function relToAbs($text, $base) { if (empty($base)) return $text; // base url needs trailing/ if (substr($base, -1, 1) != "/") $base .= "/"; // Replace links $pattern = "/<a([^>]*) " . "href=\"[^http|ftp|https|mailto]([^\"]*)\"/"; $replace = "<a\${1} href=\"" . $base . "\${2}\""; $text = preg_replace($pattern, $replace, $text); // Replace images $pattern = "/<img([^>]*) " . "src=\"[^http|ftp|https]([^\"]*)\"/"; $replace = "<img\${1} src=\"" . $base . "\${2}\""; $text = preg_replace($pattern, $replace, $text); // Done return $text; } ?> 

http://www.gerd-riesselmann.net/archives/2005/11/rss-doesnt-know-a-base-url

size Gerd ederiz! Ve bana base href yönünde işaret etmek için shadyyx teşekkür ederim!

4

Mükemmel çözüm. Ancak, desenin içinde küçük bir yazım hatası var. Yukarıda yazıldığı gibi, href veya src'nin ilk karakterini kısaltır.

// Replace links 
$pattern = "/<a([^>]*) " . 
     "href=\"([^http|ftp|https|mailto][^\"]*)\"/"; 

ve

// Replace images 
$pattern = "/<img([^>]*) " . 
     "src=\"([^http|ftp|https][^\"]*)\"/"; 

ikinci değiştirme referanslar açılması parantez taşınır: Burada amaçlanan olarak çalışmaya kalıplardır. Bu, href veya src'nin http - ftp | https ile eşleşen ilk harfini yedek referanslara getiriyor.

+0

Teşekkürler, daha iyi çalışın! Sadece # ile başlayan linkler etkilenmemelidir .. [# http1 ftp | https | mailto | #] kullanımı '# head1' için çalışır, ancak 'mypage.html # head1' yerine tam url ile değiştirilmelidir. – Barryvdh

2

Href src ve base url'nin daha karmaşık hale gelmeye başlaması durumunda kabul edilen yanıt çözümünün benim için çalışmadığını öğrendim. örneğin

:

baz URL:

http://www.journalofadvertisingresearch.com/ArticleCenter/default.asp?ID=86411&Type=Article

href src: hatalı geri

/ArticleCenter/LeftMenu.asp?Type=Article&FN=&ID=86411&Vol=&No=&Year=&Any=

:

/ArticleCenter/LeftMenu.asp?Type=Article&FN=&ID=86411&Vol=&No=&Year=&Any=
Doğru URL döner aşağıdaki işlevi bulundu. Bunu bir yorumdan aldım: Isaac Z. Schlueter'den http://php.net/manual/en/function.realpath.php.Yeterince `daki` `< "http://mydomain.com"= temel href>
http://www.journalofadvertisingresearch.com/ArticleCenter/LeftMenu.asp?Type=Article&FN=&ID=86411&Vol=&No=&Year=&Any=

function resolve_href ($base, $href) { 

// href="" ==> current url. 
if (!$href) { 
    return $base; 
} 

// href="http://..." ==> href isn't relative 
$rel_parsed = parse_url($href); 
if (array_key_exists('scheme', $rel_parsed)) { 
    return $href; 
} 

// add an extra character so that, if it ends in a /, we don't lose the last piece. 
$base_parsed = parse_url("$base "); 
// if it's just server.com and no path, then put a/there. 
if (!array_key_exists('path', $base_parsed)) { 
    $base_parsed = parse_url("$base/ "); 
} 

// href="/ ==> throw away current path. 
if ($href{0} === "/") { 
    $path = $href; 
} else { 
    $path = dirname($base_parsed['path']) . "/$href"; 
} 

// bla/./bloo ==> bla/bloo 
$path = preg_replace('~/\./~', '/', $path); 

// resolve /../ 
// loop through all the parts, popping whenever there's a .., pushing otherwise. 
    $parts = array(); 
    foreach ( 
     explode('/', preg_replace('~/+~', '/', $path)) as $part 
    ) if ($part === "..") { 
     array_pop($parts); 
    } elseif ($part!="") { 
     $parts[] = $part; 
    } 

return ( 
    (array_key_exists('scheme', $base_parsed)) ? 
     $base_parsed['scheme'] . '://' . $base_parsed['host'] : "" 
) . "/" . implode("/", $parts); 
} 
+1

Katkınız için teşekkürler! – maartenmachiels

İlgili konular