解决一个错误的 Url 以清理 PHP 中的 Url


solve a bad Url to clean Url in php?

当我窥探一个网站时,我得到了很多这样的坏网址。 http://example.com/../../.././././1.htm http://example.com/test/../test/.././././1.htm http://example.com/.//1.htm http://example.com/../test/..//1.htm

所有这些都应该http://example.com/1.htm.如何使用PHP代码来做到这一点,谢谢。

PS:我使用 http://snoopy.sourceforge.net/我的数据库中有很多重复的链接,"http://example.com/../test/..//1.htm"应该是"http://example.com/1.htm"。

你可以

这样做,假设你提供的所有网址都应该是http://example.com/1.htm

$test = array('http://example.com/../../../././.'./1.htm',
              'http://example.com/test/../test/../././.'./1.htm',
              'http://example.com/.//1.htm',
              'http://example.com/../test/..//1.htm');
foreach ($test as $url){
    $u = parse_url($url);
    $path = $u['scheme'].'://'.$u['host'].'/'.basename($u['path']);
    echo $path.'<br />'.PHP_EOL;
}
/* result
http://example.com/1.htm<br />
http://example.com/1.htm<br />
http://example.com/1.htm<br />
http://example.com/1.htm<br />
*/

//or as a function @lpc2138
function getRealUrl($url){ 
    $u = parse_url($url); 
    $path = $u['scheme'].'://'.$u['host'].'/'.basename($u['path']);
    $path .= (!empty($u['query'])) ? '?'.$u['query'] : ''; 
    return $path;
} 

您似乎正在寻找一种删除点段的算法:

function remove_dot_segments($abspath) {
    $ib = $abspath;
    $ob = '';
    while ($ib !== '') {
        if (substr($ib, 0, 3) === '../') {
            $ib = substr($ib, 3);
        } else if (substr($ib, 0, 2) === './') {
            $ib = substr($ib, 2);
        } else if (substr($ib, 0, 2) === '/.' && ($ib[2] === '/' || strlen($ib) === 2)) {
            $ib = '/'.substr($ib, 3);
        } else if (substr($ib, 0, 3) === '/..' && ($ib[3] === '/' || strlen($ib) === 3)) {
            $ib = '/'.substr($ib, 4);
            $ob = substr($ob, 0, strlen($ob)-strlen(strrchr($ob, '/')));
        } else if ($ib === '.' || $ib === '..') {
            $ib = '';
        } else {
            $pos = strpos($ib, '/', 1);
            if ($pos === false) {
                $ob .= $ib;
                $ib = '';
            } else {
                $ob .= substr($ib, 0, $pos);
                $ib = substr($ib, $pos);
            }
        }
    }
    return $ob;
}

这将删除.段和..段。任何对任何其他段的删除,如空段(//)或.'.都不符合标准,因为它会改变路径的语义。

你可以做一些花哨的正则表达式,但这工作得很好。

fixUrl('http://example.com/../../../././.'./1.htm');
function fixUrl($str) {
    $str = str_replace('../', '', $str);
    $str = str_replace('./', '', $str);
    $str = str_replace(''.', '', $str);
    return $str;
}