-4

私はプロジェクトに取り組んでおり、このプロジェクトでは、ユーザー入力が有効な URL であることを確認する必要があります。

URL で使用できるすべての文字に対して preg_match を作成しました。ただし、HTTP:///HTTPS:// が URL の前にない場合はエラーを表示するようにしています。

これが私がやったことです。

if(preg_match('/[^0-9a-zA-Z.\-\/:?&=#%_]/', $url) || substr($url, 0, 7) != "http://" || substr($url, 0, 8) != "https://") {

しかし、それはうまくいきません。OKメッセージが表示され続けます。ここで何が間違っているのかわかりません。助けていただければ幸いです。

if ステートメントは true または false を返します。そう

    if(preg_match('/[^0-9a-zA-Z.\-\/:?&=#%_]/', $url) || substr($url, 0, 7) != "http://" || substr($url, 0, 8) != "https://") {
echo "true";
} else {
echo "false";
}

URLに有効なURLが入力されているかどうかを確認するだけです。私はそれを確認する必要はありません。HTTP:// または HTTPS:// があり、有効な URL 文字が含まれているかどうかを確認するだけです。

4

4 に答える 4

14

正規表現の代わりに、自分で物事を簡単にして、filter_varで URL フィルタリングを使用できます。

if (filter_var($url, FILTER_VALIDATE_URL)) { ...
于 2013-06-21T17:00:34.373 に答える
7

または、正規表現なしでこれを行うことができます。URLを検証する必要もありますがhttp://">bla</a><script>alert('XSS');</script>、値がそこのURLとして渡されると想像してください

<?php
$url = 'http://example.com';

if(in_array(parse_url($url, PHP_URL_SCHEME),array('http','https'))){
    if (filter_var($url, FILTER_VALIDATE_URL) !== false) {
        //valid url
    }else{
        //not valid url
    }
}else{
    //no http or https
}
?>
于 2013-06-21T17:03:12.873 に答える
0

Web サイトの URL を使用してユーザー入力を検証するには、スキームの有無にかかわらず、www の有無にかかわらず許可してから、ビューでスキームを追加して外部 URL として設定することをお勧めします。

    $withWww = 'www.' . str_replace(array('www.'), '', $value);
    $withScheme = 'http://' . str_replace(array('http://', 'htttps://'), '', $withWww);
    $headers = @get_headers($withScheme);
    if (strpos($headers[0], '200') === false) {
        return false;
    }
于 2016-08-29T14:34:18.860 に答える