0

例えば:

次の文字列があります。var x = "/windows/far/away/foo.jpg"

その文字列が URL であるかどうかはどうすればよいでしょうか?

私がする必要があるのは:

if (x.charAt(0) == '/') {
   x = "http://www.example.com/" + x;
}
else {
   x = "http://www.example.com/one/two/three" + x;
}

ここでの問題は、x が URL になるとどうなるかということです。お気に入り:

x = "http://www.externalpage.com/foo.jpg";

ご覧のとおり、結果は次のようになりますx.charAt(0)'h'

http://www.example.com/one/two/threehttp://www.externalpage.com/foo.jpg

さて、このような「多分」解決策:

if (is_valid_url( x )) {
 ....
}
else {
 ....
}

私はこれにこの関数を使用しています:

function is_valid_url(str) {
  var pattern = new RegExp('^(https?:\/\/)?'+ // protocol
    '((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|'+ // domain name
    '((\d{1,3}\.){3}\d{1,3}))'+ // OR ip (v4) address
    '(\:\d+)?(\/[-a-z\d%_.~+]*)*'+ // port and path
    '(\?[;&a-z\d%_.~+=-]*)?'+ // query string
    '(\#[-a-z\d_]*)?$','i'); // fragment locater
  if(!pattern.test(str)) {
    alert("Please enter a valid URL.");
    return false;
  } else {
    return true;
  }
}

ただし、この関数は http と https でのみ機能し、ftp などの他のスキームでは機能しません。

問題を理解していただき、解決策を教えていただければ幸いです。ありがとう。

4

4 に答える 4

3

https?他のプロトコルで動作させるには、次のように、パターンを必要なプロトコルに一致する式に置き換えるだけです。

var pattern = new RegExp('^((http|https|ftp|gopher|ssh|telnet):\/\/)?'+ // protocol
于 2013-04-30T08:14:09.013 に答える
1

Lee Kowalkowski の回答と同様に、<a>要素を使用して「ブラウザに作業をさせる」ことをお勧めします。これは、GETリクエストが起動されないことを意味し、検証ステップ中に発生する可能性のある悪意のあるエントリからあなたとあなたのユーザーを保護します。ただし、 URLが実際の場所を指しているかどうかがわからないことを意味します。

function fixURL(str) {
    var a = document.createElement('a');
    a.href = str;
    return a.href;
}


fixURL('foo/bar');       // "https://stackoverflow.com/questions/16295050/foo/bar"
fixURL('/foo/bar');      // "https://stackoverflow.com/foo/bar"
fixURL('ftp://foo/bar'); // "ftp://foo/bar"

この手順の後、既知の「悪い」URL をチェックすることもできます (おそらくサーバー側で行います)。

于 2013-04-30T08:40:58.340 に答える
1

実際には画像の URL を正規化したいようです。つまり、与えられた文字列を絶対 URL に変換したいのです。私はこれをします:

var x = /* insert arbitrary string here */;
var img = document.createElement('img');
img.src = x;
var absoluteUrl = img.src;

面倒な作業はブラウザに任せましょう。

これが画像に固有のものである場合は、img.onloadおよびimg.onerrorイベントを使用して、URL が画像を参照しているかどうかを検出することもできます。

于 2013-04-30T08:24:17.467 に答える
0

((news|(ht|f)tp(s?)):\/\/)プロトコルを、news://、http://、https://、ftp:// に一致するものに置き換えました。

function is_valid_url(str) {
  var pattern = new RegExp('^((news|(ht|f)tp(s?)):\\/\\/)'+ // protocol
    '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name
    '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
    '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
    '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
    '(\\#[-a-z\\d_]*)?$','i'); // fragment locater
  if(!pattern.test(str)) {
    alert("Please enter a valid URL.");
    return false;
  } else {
    return true;
  }
}
于 2013-04-30T08:16:15.347 に答える