解决一个糟糕的Url来清理php中的url?

时间:2012-07-06 02:07:57

标签: 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”。

3 个答案:

答案 0 :(得分: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;
} 

答案 1 :(得分:0)

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

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

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

    return $str;
}

答案 2 :(得分:0)

您似乎在寻找algorithm to remove the dot segments

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

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