0

無効なリンクが追加されるのを防ぐために、WordPress ビルドで次のコードをよく使用します。

// add http:// if necessary
function addHttp($url) {
    if(substr($url, 0, 4) == 'www.') {
        $url = 'http://' . $url;
    }
    return $url;
}

しかし、誰かが「http://」を含み「www.」を含まないリンクを追加した場合、これは機能しません。そこにも。

これに対応するためにスクリプトを変更する方法を知っている人はいますか?

4

2 に答える 2

7
  1. URL に含まれていると想定しないでくださいwww。これを追加すると、URL が壊れることがよくあります。
  2. httporで始まるかどうかをテストし、httpsそうでない場合はスキームを追加します

そう:

function addHttp($url) {
  if(substr($url, 0, 4) != 'http') {
    $url = 'http://' . $url;
  }
  return $url;
}
于 2013-08-31T15:06:46.317 に答える
-5

それを確認してから、対処するケースですでに行ったように、ケースにも対処する必要があります。

このようなタスクが非常に簡単になるため、通常は URL 処理用のNetUrl2クラスをお勧めします。

ただし、次の変更を行うだけで、カバーしていない他の部分を正規化するだけでなく、スキームを適切にチェックすることもできます。あなたが求めたを追加する部分を強調表示したwww.ので、不要になった場合は簡単に削除できます。

function addHttp($url) {
    $parts = parse_url($url);

    $modif = function ($key, $prefix, $default = '') use (&$parts)
    {
        $parts[$key] = isset($parts[$key]) ? $prefix . $parts[$key] : $default;
    };

    $modif('scheme', '', 'http');
    $parts['scheme'] = strtolower($parts['scheme']);

    if (isset($parts['path']) && $parts['path'][0] !== '/')
    {
        $pathIsInPath  = strstr($parts['path'], '/', TRUE);
        $parts['host'] = $pathIsInPath ? : (isset($parts['host']) ? $parts['host'] : '') . $parts['path'];
        $parts['path'] = $pathIsInPath ? substr($parts['path'], strlen($pathIsInPath)) : '';
    }

    if (isset($parts['port']) && $parts['scheme'] === getservbyport($parts['port'], 'tcp')) {
        unset($parts['port']);
    }

    $modif('path', '', '/');
    $parts['path'] === '/' && $parts['path'] = '';

    // add www. if wanted
    if (substr($parts['host'], 0, 4) !== 'www.') {
        $modif('host', 'www.');
    }

    return sprintf('%s://%s%s%s%s%s', $parts['scheme'], $parts['host'], $modif('port', ':')
        , $parts['path'], $modif('query', '?'), $modif('fragment', '#'));
}
于 2013-08-31T15:06:32.080 に答える