Heim  >  Artikel  >  Backend-Entwicklung  >  So konvertieren Sie relative Pfade mithilfe regulärer Ausdrücke in PHP in absolute Pfade

So konvertieren Sie relative Pfade mithilfe regulärer Ausdrücke in PHP in absolute Pfade

高洛峰
高洛峰Original
2017-03-01 16:24:551322Durchsuche

Vorwort

Jeder sollte es erlebt haben, dass es beim Webcrawlen oft notwendig ist, die vom Crawler gesuchten Hyperlinks zu verarbeiten und einheitlich in „Absolut“ zu ändern Pfad, daher hat dieser Artikel einen regulären Ausdruck geschrieben, um die gesuchten Links zu verarbeiten. Im Folgenden gibt es nicht viel zu sagen. Werfen wir einen Blick auf die ausführliche Einführung.

Normalerweise suchen wir nach folgenden Links:

<!-- 空超链接 -->
<a href=""></a> 
<!-- 空白符 -->
<a href=" " rel="external nofollow" > </a>
<!-- a标签含有其它属性 -->
<a href="index.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" alt="超链接"> index.html </a>
<a href="/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank"> / target="_blank" </a>
<a target="_blank" href="/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" alt="超链接" > target="_blank" / alt="超链接" </a>
<a target="_blank" title="超链接" href="/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" alt="超链接" > target="_blank" title="超链接" / alt="超链接" </a>
<!-- 根目录 -->
<a href="/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" > / </a>
<a href="a" rel="external nofollow" > a </a>
<!-- 含参数 -->
<a href="/index.html?id=1" rel="external nofollow" > /index.html?id=1 </a>
<a href="?id=2" rel="external nofollow" > ?id=2 </a>
<!-- // -->
<a href="//index.html" rel="external nofollow" > //index.html </a>
<a href="//www.mafutian.net" rel="external nofollow" > //www.mafutian.net </a>
<!-- 站内链接 -->
<a href="http://www.hole_1.com/index.html" rel="external nofollow" > http://www.php.cn/ </a>
<!-- 站外链接 -->
<a href="http://www.mafutian.net" rel="external nofollow" > http://www.php.cn/ </a>
<a href="http://www.numberer.net" rel="external nofollow" > http://www.php.cn/ </a>
<!-- 图片,文本文件格式的链接 -->
<a href="1.jpg" rel="external nofollow" > 1.jpg </a>
<a href="1.jpeg" rel="external nofollow" > 1.jpeg </a>
<a href="1.gif" rel="external nofollow" > 1.gif </a>
<a href="1.png" rel="external nofollow" > 1.png </a>
<a href="1.txt" rel="external nofollow" > 1.txt </a>
<!-- 普通链接 -->
<a href="index.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" > index.html </a>
<a href="index.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" > index.html </a>
<a href="./index.html" rel="external nofollow" > ./index.html </a>
<a href="../index.html" rel="external nofollow" > ../index.html </a>
<a href=".../" rel="external nofollow" > .../ </a>
<a href="..." rel="external nofollow" > ... </a>
<!-- 非链接,含有链接冒号 --> 
<a href="javascript:void(0)" rel="external nofollow" > javascript:void(0) </a>
<a href="a:b" rel="external nofollow" > a:b </a>
<a href="/a#a:b" rel="external nofollow" > /a#a:b </a>
<a href="mailto:&#39;mafutian@126.com&#39;" rel="external nofollow" > mailto:&#39;mafutian@126.com&#39; </a>
<a href="/tencent://message/?uin=335134463" rel="external nofollow" > /tencent://message/?uin=335134463 </a> 
<!-- 相对路径 -->
<a href="." rel="external nofollow" > . </a>
<a href=".." rel="external nofollow" > .. </a>
<a href="../" rel="external nofollow" > ../ </a>
<a href="/a/b/.." rel="external nofollow" > /a/b/.. </a>
<a href="/a" rel="external nofollow" > /a </a>
<a href="./b" rel="external nofollow" > ./b </a>
<a href="./././././././././b" rel="external nofollow" > ./././././././././b </a> <!-- 其实就是 ./b -->
<a href="../c" rel="external nofollow" > ../c </a>
<a href="../../d" rel="external nofollow" > ../../d </a>
<a href="../a/../b/c/../d" rel="external nofollow" > ../a/../b/c/../d </a>
<a href="./../e" rel="external nofollow" > ./../e </a>
<a href="http://www.hole_1.org/./../e" rel="external nofollow" > http://www.php.cn/ </a> 
<a href="./.././f" rel="external nofollow" > ./.././f </a>
<a href="http://www.hole_1.org/../a/.../../b/c/../d/.." rel="external nofollow" > http://www.php.cn/ </a> 
<!-- 带有端口号 -->
<a href=":8081/index.html" rel="external nofollow" > :8081/index.html </a>
<a href="http://www.mafutian.net:80/index.html" rel="external nofollow" > :80/index.html </a>
<a href="http://www.mafutian.net:8081/index.html" rel="external nofollow" > http://www.php.cn/:8081/index.html </a>
<a href="http://www.mafutian.net:8082/index.html" rel="external nofollow" > http://www.php.cn/:8082/index.html </a>

Der erste Schritt der Verarbeitung besteht darin, ihn auf einen absoluten Pfad festzulegen:

http:// ... / ../ ../

Dann geht es in diesem Artikel darum So entfernen Sie den absoluten Pfad. Implementierungscode von './', '../', '/..' im Pfad:

function url_to_absolute($relative)
{
 $absolute = &#39;&#39;;
 // 去除所有的 &#39;./&#39;
 $absolute = preg_replace(&#39;/(?<!\.)\.\//&#39;,&#39;&#39;,$relative);
 $count = preg_match_all(&#39;/(?<!\/)\/([^\/]{1,}?)\/\.\.\//&#39;,$absolute,$res);
 // 迭代去除所有的 &#39;/abc/../&#39;
 do
 {
 $absolute = preg_replace(&#39;/(?<!\/)\/([^\/]{1,}?)\/\.\.\//&#39;,&#39;/&#39;,$absolute);
 $count = preg_match_all(&#39;/(?<!\/)\/([^\/]{1,}?)\/\.\.\//&#39;,$absolute,$res); 
 }while($count >= 1);
 // 除去最后的 &#39;/..&#39;
 $absolute = preg_replace(&#39;/(?<!\/)\/([^\/]{1,}?)\/\.\.$/&#39;,&#39;/&#39;,$absolute);
 $absolute = preg_replace(&#39;/\/\.\.$/&#39;,&#39;&#39;,$absolute);
 // 除去存在的 &#39;../&#39;
 $absolute = preg_replace(&#39;/(?<!\.)\.\.\//&#39;,&#39;&#39;,$absolute);
 return $absolute;
}
$relative = &#39;http://www.mytest.org/../a/.../../b/c/../d/..&#39;;
var_dump(url_to_absolute($relative));
// 输出:string &#39;http://www.mytest.org/a/b/&#39; (length=26)

Weitere Artikel darüber, wie PHP reguläre Ausdrücke verwendet, um relative Pfade in absolute Pfade umzuwandeln, finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn