0

当我浏览一个网站时,我得到了很多像这样的坏网址。 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'。

4

3 回答 3

1

您可以这样做,假设您提供的所有网址都应该是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;
} 
于 2012-07-06T02:53:00.990 回答
0

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

fixUrl('http://example.com/../../../././.\./1.htm');

function fixUrl($str) {
    $str = str_replace('../', '', $str);
    $str = str_replace('./', '', $str);
    $str = str_replace('\.', '', $str);

    return $str;
}
于 2012-07-06T02:22:42.813 回答
0

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

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

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

于 2012-07-06T05:54:05.923 回答