2012-11-19 45 views
8

में कनवर्ट करें PHP में पूर्ण पथ के सापेक्ष रूपांतरित करने पर बहुत सी पोस्ट हैं। मैं इन पदों (आशावादी) से परे एक विशिष्ट कार्यान्वयन की तलाश में हूं। क्या कोई इस विशिष्ट कार्यान्वयन के साथ मेरी मदद कर सकता है?PHP: आउटपुट में सापेक्ष पथ के साथ छवियों और लिंक खोजें और उन्हें पूर्ण पथ

मेरे पास एक पीएचपी वैरिएबल है जिसमें विविध HTML शामिल हैं, जिसमें href एस और img एस संबंधित यूआरएल शामिल हैं। अधिकतर (उदाहरण के लिए) /en/discover या /img/icons/facebook.png

मैं इस तरह से है कि मेरे href रों के मूल्यों और img रों http://mydomain.com/en/discover और http://mydomain.com/img/icons/facebook.png

में परिवर्तित हो जाएगा में इस पीएचपी चर पर कार्रवाई करना चाहते हैं मैं कवर नीचे दिए गए प्रश्न का मानना ​​है href एस के लिए समाधान। img एस पर भी विचार करने के लिए हम इसका विस्तार कैसे कर सकते हैं?

एक regex क्रम में होगा? या चूंकि हम बहुत सारे आउटपुट से निपट रहे हैं, क्या हम DOMDocument का उपयोग कर सकते हैं?

+0

और का उपयोग नहीं किया जाएगा '<आधार href =" http://mydomain.com ">' में अपनी '' पर्याप्त? यदि नहीं, तो रेगेक्स का उपयोग करना आप सब कुछ कर सकते हैं - वास्तव में आपको 'preg_replace_all' फ़ंक्शन का उपयोग करने की आवश्यकता होगी। – shadyyx

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। अच्छा सुझाव है, लेकिन मुझे ऐसा नहीं लगता है, क्योंकि आउटपुट को एक्सएमएल-दस्तावेज़ में प्रदर्शित किया जाएगा। समस्या यह है कि मैं regexes के साथ अक्षम हूँ ... – maartenmachiels

उत्तर

8

कुछ और शोध के बाद मैंने आरएसएस फ़ीड के लिए base href समाधान की अनुपस्थिति को हल करने के तरीके पर Gerd Riesselmann से इस लेख पर ठोकर खाई है। उसका स्निपेट वास्तव में मेरा प्रश्न हल करता है!

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

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

आप गर्ड धन्यवाद! और base href की दिशा में मुझे इंगित करने के लिए shadyyx धन्यवाद!

4

उत्कृष्ट समाधान। हालांकि, पैटर्न में एक छोटा टाइपो है। जैसा कि ऊपर लिखा गया है, यह href या src के पहले अक्षर को छोटा करता है।

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

और

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

दूसरा प्रतिस्थापन संदर्भ की आरंभिक कोष्ठक ले जाया जाता है: यहाँ पैटर्न है कि इरादा के रूप में काम कर रहे हैं। यह href या src का पहला अक्षर लाता है जो प्रतिस्थापन संदर्भों में http | ftp | https से मेल नहीं खाता है।

+0

धन्यवाद, बेहतर काम करते हैं! # से शुरू होने वाले लिंक को प्रभावित नहीं किया जाना चाहिए .. [^ http | ftp | https | mailto | #] का उपयोग '# head1' के लिए काम करता है, लेकिन इसे पूर्ण url के साथ 'mypage.html # head1' को प्रतिस्थापित करना चाहिए .. – Barryvdh

2

मुझे पता चला कि जब href src और base url अधिक जटिल हो रहा है, तो स्वीकृत उत्तर समाधान मेरे लिए काम नहीं करता है।

उदाहरण के लिए

:

आधार यूआरएल:

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

href src:

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

गलत तरीके से लौटे:

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

मैं नीचे समारोह जो सही ढंग से यूआरएल रिटर्न मिल गया। मुझे यह एक टिप्पणी से मिला: http://php.net/manual/en/function.realpath.php इसहाक जेड Schlueter से।

यह सही ढंग से लौटे:

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

आपके योगदान के लिए धन्यवाद! – maartenmachiels