9

PHP の相対パスから絶対パスへの変換に関する投稿がたくさんあります。これらの投稿を超えた特定の実装を探しています (うまくいけば)。誰かがこの特定の実装で私を助けてくれますか?

相対 URL を含むhrefおよびを含む、さまざまな HTML を含む PHP 変数があります。imgほとんど(たとえば)/en/discoverまたは/img/icons/facebook.png

hrefs とimgs の値が と に変換されるように、この PHP 変数を処理したいと考えていますhttp://mydomain.com/en/discoverhttp://mydomain.com/img/icons/facebook.png

以下の質問がhrefsの解決策をカバーしていると思います。imgこれを拡張してsも考慮するにはどうすればよいでしょうか。

正規表現は適切でしょうか?それとも、大量の出力を扱っているので、DOMDocument を使用する必要がありますか?

4

3 に答える 3

9

base hrefさらに調査を重ねた結果、RSS フィードの解決策がないことを解決する方法について、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;
}
?>

ゲルトありがとう!そして、shadyyx さん、私を の方向に向けてくれてありがとうbase href

于 2012-11-20T14:04:02.967 に答える
4

優れたソリューション。ただし、パターンに小さなタイプミスがあります。上記のように、href または src の最初の文字を切り捨てます。意図したとおりに機能するパターンは次のとおりです。

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

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

2 番目の置換参照の左括弧が移動されます。これにより、http|ftp|https と一致しない href または src の最初の文字が置換参照に取り込まれます。

于 2013-05-22T20:53:37.163 に答える
3

href src と base url がより複雑になり始めたとき、受け入れられた回答ソリューションがうまくいかないことがわかりました。

例えば:

ベース URL:

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

href ソース:

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

誤って返された:

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

URLを正しく返す以下の関数を見つけました。これは、 Isaac Z. Schlueterのhttp://php.net/manual/en/function.realpath.phpのコメントから入手しました。

これは正しく返されました:

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); 
} 
于 2015-07-29T06:49:34.737 に答える