একটি জাভাস্ক্রিপ্ট স্ট্রিং একটি URL কিনা পরীক্ষা করুন


283

জাভা স্ক্রিপ্টে স্ট্রিংয়ের URL আছে কিনা তা পরীক্ষা করার কোনও উপায় আছে?

ইউআরএল সম্ভবত লিখিত হয় বলে RegExes বাদ দেওয়া হয় stackoverflow; এর অর্থ এটি হতে পারে না .com, wwwবা http


22
যদি এটি অনুপস্থিত থাকে তবে httpএটি ডিফল্ট কোনও url নয়।
এনফেকনারের

1
@ এনটেকনার বলতে গেলে যে এটি যদি কোনও প্রোটোকল নির্দিষ্ট না করে এবং কোলন চরিত্রটি ব্যবহার না করে (তবে আগে দুটি ফরোয়ার্ড স্ল্যাশ সহ) তবে এটি কোনও ইউআরএল নয়?
jcolebrand

5
আপনি যেমন ইউআরএল আরএফসিতে পড়তে পারেন , স্ট্রিংকে বৈধ ইউআরএল তৈরি করার জন্য শুধুমাত্র প্রয়োজনীয় অংশটি হ'ল কোলন। বৈধ ইউআরএলগুলি দেখতে দেখতে:<scheme>:<scheme-specific-part>
এনফেকনার


8
কোনও কিছু ইউআরএল কিনা তা আপনি কীভাবে পরীক্ষা করে দেখেন যে আরও যোগ্যতা ছাড়াই অত্যন্ত প্রাসঙ্গিক-নির্ভর এবং খুব অস্পষ্ট। এটি ইউআরএল আরএফসি অনুমানের সাথে সামঞ্জস্য করে কিনা, ইউআরএল খোলার জন্য কোনও ওএস সিস্টেম কল করারhref সময় কাজ করে, অ্যাঙ্কর উপাদানটিতে একটি হিসাবে পার্স করে, কল করার সময় কাজ করে window.open(url), সত্যিকার অর্থে উপস্থিত এমন কোনও কিছুকে নির্দেশ করে, ব্রাউজারের অবস্থানের সাথে কাজ করে কিনা তা আপনার জন্য কী গুরুত্বপূর্ণ? বার, বা উপরের সংমিশ্রণ? আপনি এইগুলির মধ্যে কোনটির যত্ন নেবেন তার উপর নির্ভর করে আপনি খুব আলাদা উত্তর পেয়ে যাবেন।
রায় টিঙ্কার

উত্তর:


188

একটি উত্তর সহ একটি সম্পর্কিত প্রশ্ন:

জাভাস্ক্রিপ্ট রিজেক্স URL টি মিলছে

বা ডেভশেড থেকে এই রেজিপ্সপ :

function validURL(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 locator
  return !!pattern.test(str);
}

1
আমি জানি তবে আমি আমার বুকমার্কগুলিতে অনুসন্ধান করছি এবং তাদের বেশিরভাগ স্ট্যাকওভারফ্লো (.কম, ইত্যাদি ছাড়া) এর মতো লেখা রয়েছে
ব্রুনো

3
@ ব্রুনো: সম্ভবত খুব সম্ভবত তারা পৃথক শিরোনাম এবং ইউআরএল, যেমন { title: "Stackoverflow", uri: "http://stackoverflow.com" } আপডেটের মতো অভ্যন্তরীণভাবে সংরক্ষিত হয়েছে : প্রকৃতপক্ষে, কোড. google.com
মার্সেল করপেল

10
আপনার উদাহরণ ব্যবহার করার চেষ্টা করছি। তবে আমি ফায়ারবগে ত্রুটি পেয়ে যাচ্ছি যা বলছে invalid quantifier। কোন ধারণা?
সিসির

125
ফাংশনটি রিটার্ন দেয়: SyntaxError: Invalid regular expression: /^(https?://)?((([a-zd]([a-zd-]*[a-zd])*).)+[a-z]{2,}|((d{1,3}.){3}d{1,3}))(:d+)?(/[-a-zd%_.~+]*)*(?[;&a-zd%_.~+=-]*)?(#[-a-zd_]*)?$/: Invalid group গুগল ক্রোম (সংস্করণ 30.0.1599.101) (ম্যাক ওএস এক্স: 10.8.5)
dr.dimitru

10
সচেতন হন যে আপনি যদি প্যারামিটার হিসাবে একটি স্ট্রিং ব্যবহার করেন তবে আপনাকে RegExpব্যাকস্ল্যাশগুলি দ্বিগুণ করতে হবে - অন্যথায় আপনি অবৈধ গোষ্ঠীর মতো ত্রুটি পান ।
কেজেল

165
function isURL(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 locator
  return pattern.test(str);
}

13
গুগল অনুসন্ধান ইমেজ লিঙ্কগুলির জন্য ব্যর্থ:http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707
বিল ডেভিস

7
এটি অব্যবহৃত ধীর
হার্নান এচে

3
@ হার্নেনএচে ধীর বলতে কী বোঝাতে চাইছেন ? start = new Date(); isURL("http://michalstefanow.com"); end = new Date(); diff = end - start; console.log(diff)আমি একটি কেটলি লাগালাম, একটি টয়লেটে গেলাম, আমার মাকে ডাকলাম এবং জিনিসটি কোনও সময়ই শেষ হয়ে গেল ...
মঙ্গল রবার্টসন

62
এটির trueজন্য ফিরে আসে aaa
অ্যালেক্স নওমভ

1
এটি একেবারে সঠিক উত্তর হওয়া উচিত নয়। এটি অনেক পরীক্ষার ক্ষেত্রে ব্যর্থ হয় এবং আরও গুরুত্বপূর্ণ এটি আপনার পৃষ্ঠাটিকে এমনকি একটি ছোট স্ট্রিংয়ে ঝুলিয়ে দেয়: isURL('12345678901234567890123')আরও কিছু অক্ষর যুক্ত করুন এবং এটি আরও খারাপ।
এমার্কস

142

আপনি URLকনস্ট্রাক্টর ব্যবহার করার চেষ্টা করতে পারেন : যদি এটি নিক্ষেপ না করে তবে স্ট্রিংটি একটি বৈধ URL:

function isValidUrl(string) {
  try {
    new URL(string);
  } catch (_) {
    return false;  
  }

  return true;
}

'ইউআরএল' শব্দটি আরএফসি 3886 (ইউআরআই হিসাবে) সংজ্ঞায়িত হয়েছে ; এটি অবশ্যই একটি প্রকল্পের নামের সাথে শুরু হওয়া উচিত এবং স্কিমের নামটি http / https এর মধ্যে সীমাবদ্ধ নয়।

উল্লেখযোগ্য উদাহরণ:

  • www.google.com বৈধ URL নয় (স্কিম অনুপস্থিত)
  • javascript:void(0) বৈধ ইউআরএল, যদিও এটি কোনও HTTP নয়
  • http://..কার্যকর URL, সাথে আছেন হোস্ট হচ্ছে ..; এটি সমাধান করে কিনা তা আপনার ডিএনএসের উপর নির্ভর করে
  • https://google..com বৈধ ইউআরএল, উপরের মতো

আপনি যদি স্ট্রিংটি বৈধ HTTP URL কিনা তা পরীক্ষা করতে চান:

function isValidHttpUrl(string) {
  let url;

  try {
    url = new URL(string);
  } catch (_) {
    return false;  
  }

  return url.protocol === "http:" || url.protocol === "https:";
}

13
@ অ্যাশডি না, এটি নেই; যেমন আপনি hrefজন্য গুণ হিসাবে ব্যবহার করতে পারবেন না <a>। বৈধ URL টি অবশ্যই একটি স্কিমের নাম দিয়ে শুরু করা উচিত , যেমন https://
পাভলো

3
নতুন ইউআরএল ('জাভাস্ক্রিপ্ট: সতর্কতা (23)')
ব্লেড091

6
এই আয় সত্য @PavloisValidUrl("javascript:void(0)")
Praveena

3
আমাকে জেএস সম্পর্কে নতুন বিষয় শেখানোর জন্য এটি পছন্দ করি! এটির কোনও মিথ্যা নেতিবাচকতা নেই যা আমি খুঁজে পেতে পারি। এর কিছু মিথ্যা http://..http:///a
ধনাত্মকতা রয়েছে

2
ইউআরএল এজ থেকে শুরু করে কাজ করছে তাই এর নীচের সমস্ত কিছু আপনার প্রত্যাশার মতো চলতে পারে না। নিশ্চিত করুন যে আপনি প্রথমে সামঞ্জস্যতা পরীক্ষা করেছেন।
টনি টি।

97

একটি নিয়মিত অভিব্যক্তি ব্যবহার না করে, আমি একটি অ্যাঙ্কর উপাদান ব্যবহার করার পরামর্শ দেব।

আপনি যখন কোনওটির hrefসম্পত্তি সেট করেন anchor, অন্যান্য বিভিন্ন বৈশিষ্ট্য সেট করা হয়।

var parser = document.createElement('a');
parser.href = "http://example.com:3000/pathname/?search=test#hash";

parser.protocol; // => "http:"
parser.hostname; // => "example.com"
parser.port;     // => "3000"
parser.pathname; // => "/pathname/"
parser.search;   // => "?search=test"
parser.hash;     // => "#hash"
parser.host;     // => "example.com:3000"

উৎস

যাইহোক, মানটি hrefযদি আবদ্ধ হয় তবে কোনও বৈধ url না হয়, তবে সেই সহায়িক বৈশিষ্ট্যের মানটি খালি স্ট্রিং হবে be

সম্পাদনা: মন্তব্যে নির্দেশিত হিসাবে: যদি কোনও অবৈধ url ব্যবহার করা হয় তবে বর্তমান URL এর বৈশিষ্ট্যগুলি প্রতিস্থাপন করা যেতে পারে।

সুতরাং, যতক্ষণ না আপনি বর্তমান পৃষ্ঠার ইউআরএল পাস করছেন না, আপনি এর মতো কিছু করতে পারেন:

function isValidURL(str) {
   var a  = document.createElement('a');
   a.href = str;
   return (a.host && a.host != window.location.host);
}

3
এটি ক্ষেত্রে নয় (ক্রম 48 অন্তত)) তাহলে URL পাস করার a.hrefঅবৈধ, parser.hostআপনি যে পৃষ্ঠাটি বর্তমানে আছি হোস্টনেম ফেরৎ, প্রত্যাশিত না false
স্যাম বেকহ্যাম

2
গাহ! এটা বিরক্তিকর. আমি শপথ করছি আমি এটি পরীক্ষা করেছি! আমি মনে করি এটি ন্যায়সঙ্গতভাবে বলা যায় যে এই পৃষ্ঠপোষকতাটি সত্যই কখনও চলতি পৃষ্ঠায় ব্যবহার করা উচিত নয়, সুতরাং শর্তসাপেক্ষে কেবল পরিবর্তন করা যায়। আমি পোস্টটি সম্পাদনা করব।
লুক

এটি খুব সাধারণ ব্যবহারের ক্ষেত্রে নয়, তবে ফায়ারফক্স ব্রাউজার উইন্ডো (অ্যাডন বিকাশের জন্য গুরুত্বপূর্ণ) এর প্রসঙ্গে এই কৌশলটি কাজ করে না
ক্রোমড

@ স্যামবেচেহাম এই পদ্ধতিটি ব্যবহার করার সময় এটি অবশ্যই একটি উদ্বেগের বিষয়, তবে আমি কেবল উল্লেখ করতে চাই যে এটি কোনও বিশেষ আচরণ নয়। আপনি যে অবৈধ আপনার পৃষ্ঠায় একটি লিংক থাকে, তাহলে মত <a href="invalidurl">, এটা নেই আপনার ডোমেন এ যান। এটি বর্তমান url এর শেষে যুক্ত হয় gets সুতরাং ক্রোম আপনাকে "পার্সার" উপাদান থেকে বর্তমান হোস্টনাম দিয়ে সঠিক জিনিসটি করছে।
yts

4
function isValidURL(str): রিজেক্স ব্যবহারের চেয়ে অনেক বেশি ভাল! ধন্যবাদ!
রডরিগো

46

আমি ইউআরএল সাথে বা এর বাইরে যাচাই করতে নীচের ফাংশনটি ব্যবহার করছি http/https:

function isValidURL(string) {
  var res = string.match(/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g);
  return (res !== null)
};

var testCase1 = "http://en.wikipedia.org/wiki/Procter_&_Gamble";
console.log(isValidURL(testCase1)); // return true

var testCase2 = "http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707";
console.log(isValidURL(testCase2)); // return true

var testCase3 = "https://sdfasd";
console.log(isValidURL(testCase3)); // return false

var testCase4 = "dfdsfdsfdfdsfsdfs";
console.log(isValidURL(testCase4)); // return false

var testCase5 = "magnet:?xt=urn:btih:123";
console.log(isValidURL(testCase5)); // return false

var testCase6 = "https://stackoverflow.com/";
console.log(isValidURL(testCase6)); // return true

var testCase7 = "https://w";
console.log(isValidURL(testCase7)); // return false

var testCase8 = "https://sdfasdp.ppppppppppp";
console.log(isValidURL(testCase8)); // return false


2
একটি দুর্দান্ত সমাধান মনে হচ্ছে! এটি কোনও কোণার ক্ষেত্রে (যেমন এই মন্তব্যগুলি দেখুন ) দেখায় কিছু পরীক্ষা যুক্ত করতে পারেন ?
বাসজ

@ বাসজ পরীক্ষার মামলা যুক্ত করেছেন। দয়া করে চেক করুন
বিকাশদীপ সিং

খারাপ নয়, http: //⌘.ws বা 142.42.1.1 পাস করতে ব্যর্থ হয়েছে এবং এটি http: //.www.foo.bar./ কে অনুমতি দেয় তবে এটি শীর্ষ রেটেড উত্তরগুলি সহ অন্যান্য রেজেসের মতো ঝুলিয়ে রাখে না।
এমার্কস

@আমার্কস আমি আপনার উত্তরটি যাচাই করেছি। আপনার উত্তরটি ব্যর্থ হয়েছে https://sdfasdp.pppppppppppঅর্থাত্ ফিরে আসার trueতবে আমার রিটার্ন falseপ্রত্যাশিত যা আমি মনে করি।
বিকাশদীপ সিং

4
এর সত্য প্রত্যাবর্তন sadf@gmail.com... এটা করা উচিত? আমার ধারণা এটি করা উচিত নয়
জোহাব আলী

35

জাভাস্ক্রিপ্ট ব্যবহার করে url যাচাই করতে নীচে দেখানো হয়েছে

function ValidURL(str) {
  var regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
  if(!regex .test(str)) {
    alert("Please enter valid URL.");
    return false;
  } else {
    return true;
  }
}

3
রেজেক্সের বেশ কয়েকটি অংশ ব্যাপকভাবে হ্রাস করা যেতে পারে: ক) (http|https)থেকে (?:https?); খ) :{0,1}থেকে :?; গ) [0-9]থেকে\d
দিমিত্রি পার্জিৎস্কি

28

একটি লাইব্রেরির উপর নির্ভর করুন: https://www.npmjs.com/package/ માન્ય-url

import { isWebUri } from 'valid-url';
// ...
if (!isWebUri(url)) {
    return "Not a valid url.";
}

হচ্ছে একটি: এই আমার অদ্ভুত URL গুলি সমস্যা যে আসলে ব্রাউজার, যেমন দ্বারা পার্স করা হয় অনেক দেয় {URL- এ
Willyfrog

23

গৃহীত উত্তরের উন্নতি ...

  • প্রোটোকল হিসাবে ftp / ftps জন্য পরীক্ষা করুন
  • ব্যাকস্ল্যাশগুলির জন্য ডাবল পলায়ন রয়েছে (\\)
  • ডোমেনগুলির একটি বিন্দু এবং একটি এক্সটেনশান (.com .io .xyz) রয়েছে তা নিশ্চিত করে
  • পুরো কোলনকে (:) পথে অনুমতি দেয় যেমন http://thingiverse.com/download:1894343
  • এম্পারস্যান্ডকে (এবং) পথের অনুমতি দেয় যেমন http://en.wikedia.org/wiki/Pocter_&_ Gamble
  • @ প্রতীককে পথে প্রবেশের অনুমতি দেয় যেমন https://medium.com/@techytimo

    isURL(str) {
      var pattern = new RegExp('^((ft|htt)ps?:\\/\\/)?'+ // protocol
      '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name and extension
      '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
      '(\\:\\d+)?'+ // port
      '(\\/[-a-z\\d%@_.~+&:]*)*'+ // path
      '(\\?[;&a-z\\d%@_.,~+&:=-]*)?'+ // query string
      '(\\#[-a-z\\d_]*)?$','i'); // fragment locator
      return pattern.test(str);
    }

5
না এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। অন্যদের মতো এটি কেবল 33 টি চরিত্রের স্ট্রিংয়ে ঝুলছে: isURL ('123456789012345678901234567890123') এবং অনেক প্রান্তের মামলার পরীক্ষায় ব্যর্থ হয়: foo.com/blah_blah_(wikiedia)_(again ) // ভুলভাবে মিথ্যা প্রত্যাবর্তন করে।
এমার্কস

2
এর কারণ লোকালহোস্ট: 8080 কোনও বৈধ URL নয়।
শেন

1

Ftps হওয়া উচিত: // লোকালহোস্ট: 8080 =)
ভিপি_আর্থ

এটি কাজ করছে বলে মনে হচ্ছে না: দীর্ঘ ইনপুটটিতে ঝুলানো হয়েছে (যেমন @ অ্যানমার্কস বলেছেন)
সিলেমেল

13

এখানে আরও একটি পদ্ধতি রয়েছে।

var elm;
function isValidURL(u){
  if(!elm){
    elm = document.createElement('input');
    elm.setAttribute('type', 'url');
  }
  elm.value = u;
  return elm.validity.valid;
}

console.log(isValidURL('http://www.google.com/'));
console.log(isValidURL('//google.com'));
console.log(isValidURL('google.com'));
console.log(isValidURL('localhost:8000'));


শিক্ষাগত কোড! new URL(string)পাভলো কোডটি কীভাবে কাজ করে সেখানকার প্রক্রিয়াটি সম্ভবত অভিন্ন । উভয় পরীক্ষারই আমি পরীক্ষিত সমস্ত প্রান্তের কেসের সাথে অভিন্ন ফলাফল রয়েছে। আমি তার কোডটি পছন্দ করি কারণ এটি সহজ এবং উপাদান তৈরিতে জড়িত না, তবে আপনার কয়েকগুণ দ্রুত (সম্ভবত এটি প্রথম ব্যবহারের পরে এল তৈরি করে না)।
এমার্কস

1
ধন্যবাদ! আমি আপনার পরামর্শ বাস্তবায়ন। তবে সচেতন থাকুন: পুরানো ব্রাউজারগুলি এবং / অথবা মোবাইল ডিভাইস ওয়েবভিউ <ইনপুট টাইপ = ইউআরএল> উপাদান কার্যকর না করে থাকতে পারে; সুতরাং ইনপুট মানটি কেবল একটি নিয়মিত পাঠ্যের মতো (কোনও ইউআরএল বৈধতা নয়) হিসাবে বিবেচিত হবে। রেফ: ডেভেলপার.মোজিলা.আর.ইন-
ইউএস / ডকস / ওয়েবে / এইচটিএমএল / এলিমেট / ইনপুট / ইউআরএল

10

(আমার কাছে ভ্যালিডেআরএল উদাহরণে মন্তব্য করার মতো প্রত্যুত্তর নেই ; সুতরাং এটি উত্তর হিসাবে পোস্ট করুন))

প্রোটোকলের আপেক্ষিক ইউআরএল ব্যবহার করার সময় উত্সাহ দেওয়া হয় না ( প্রোটোকল-আপেক্ষিক ইউআরএল ), তারা কখনও কখনও নিযুক্ত হয়। নিয়মিত প্রকাশের সাথে এই জাতীয় URL টি বৈধতা দেওয়ার জন্য প্রোটোকল অংশটি alচ্ছিক হতে পারে, যেমন:

function isValidURL(str) {
    var pattern = new RegExp('^((https?:)?\\/\\/)?'+ // protocol
        '(?:\\S+(?::\\S*)?@)?' + // authentication
        '((([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)) {
        return false;
    } else {
        return true;
    }
}

অন্যরা যেমন উল্লেখ করেছে, নিয়মিত প্রকাশটি ইউআরএলকে বৈধতা দেওয়ার জন্য উপযুক্ত উপযুক্ত পদ্ধতি বলে মনে হয় না।


আমি প্রথমে ভেবেছিলাম এটি বেশ ভাল তবে এটি mathiasbynens.be/demo/url-regex এর অনেকগুলি পরীক্ষায় ব্যর্থ হয় এবং তারপরে এটি isValidURL("https://d1f4470da51b49289906b3d6cbd65074@app.getsentry.com/13176")
স্থগিত

হ্যাঁ, যেমনটি আমি বলেছিলাম, আমি কেবল প্রোটোকলের অংশে মন্তব্য করেছি। আমি হ্যান্ডেল করার জন্য প্রমাণীকরণের ধারাটি যুক্ত করেছি @। এটি আমার ব্রাউজারগুলিতে ঝুলছে না ।
কো লা

দুঃখিত, আমি তাদের মূল্যায়নের জন্য এর মধ্যে কয়েকটি দিয়ে যাচ্ছিলাম এবং মিস করেছি যে আপনি প্রদত্ত উত্তরে মন্তব্য করেছেন। আমি মনে করি আপনার সংশোধন এমনকি এই পৃষ্ঠাগুলি প্রথম দেখার জন্য আমাকে এগুলি শুরু করতে সহায়তা করেছিল। এখন ঝুলছে না।
এমার্কস

9

আপনি URL নেটিভ API ব্যবহার করতে পারেন :

  const isUrl = string => {
      try { return Boolean(new URL(string)); }
      catch(e){ return false; }
  }

3
@ পাভলো প্রদত্ত উত্তরের সাথে খুব মিল দেখাচ্ছে, কেবলমাত্র পরিবর্তনশীল নাম পরিবর্তন হয়েছে;)
মুনিম মুন্না

2
এখনই এটি পরীক্ষা করার জন্য একটি সাধারণ নেটিভ পদ্ধতি থাকা উচিত - এই উত্তরটি খুব আশাব্যঞ্জক মনে হলেও এটি উপরে বর্ণিত @ বাসজের সাথে সাথে সত্যই ফিরে আসে।
শূন্য_কুল

8

যেমনটি উল্লেখ করা হয়েছে নিখুঁত রেজেক্সটি অধরা তবে তবুও এটি একটি যুক্তিসঙ্গত পদ্ধতির বলে মনে হচ্ছে (বিকল্পগুলি হ'ল সার্ভার সাইড টেস্ট বা নতুন পরীক্ষামূলক ইউআরএল এপিআই )। তবে উচ্চ র‌্যাঙ্কিংয়ের উত্তরগুলি প্রায়শই সাধারণ ইউআরএলগুলির জন্য মিথ্যা প্রত্যাবর্তন করে তবে তার চেয়েও খারাপ এটি আপনার অ্যাপ / পৃষ্ঠাটিকে কয়েক মিনিটের জন্য এমনকি সাধারণ স্ট্রিংয়ের মতো স্থির করে দেবে isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')। এটি কয়েকটি মন্তব্যে চিহ্নিত করা হয়েছে, তবে সম্ভবত এটি দেখতে কোনও খারাপ মান enteredোকেনি। এর মতো ঝুলন্ত কোনও গুরুতর অ্যাপ্লিকেশনটিতে সেই কোডটিকে ব্যবহারযোগ্য নয়। আমি মনে করি এটি কোডের মতো পুনরাবৃত্তি ক্ষেত্রে সংবেদনশীল সেটগুলির কারণে ((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...। 'আমি' বের করুন এবং এটি ঝুলবে না তবে অবশ্যই ইচ্ছা মতো কাজ করবে না। এমনকি উপেক্ষা কেস পতাকার সাথেও সেই পরীক্ষাগুলি উচ্চ ইউনিকোড মানগুলিকে প্রত্যাখ্যান করে।

ইতিমধ্যে উল্লিখিত সেরাটি হ'ল:

function isURL(str) {
  return /^(?:\w+:)?\/\/([^\s\.]+\.\S{2}|localhost[\:?\d]*)\S*$/.test(str); 
}

এটি গিথুব সেগমেনটিও / ইস -ইউআরএল থেকে আসে । একটি কোড সংগ্রহস্থল সম্পর্কে ভাল জিনিস আপনি পরীক্ষা এবং কোনও সমস্যা দেখতে পাচ্ছেন এবং এটির মাধ্যমে পরীক্ষার স্ট্রিংগুলি চলতে পারে। এখানে একটি শাখা রয়েছে যা স্ট্রিংগুলির মতো প্রোটোকল অনুপস্থিত মঞ্জুরি দেয় google.com, যদিও আপনি সম্ভবত তখন অনেক বেশি অনুমান করছেন। সংগ্রহস্থল আপডেট করা হয়েছে এবং আমি এখানে একটি আয়না রাখার চেষ্টা করার পরিকল্পনা করছি না। ডস আক্রমণের জন্য ব্যবহার করা যেতে পারে এমন রেজিএক্স রেডো এড়াতে এটি পৃথক পরীক্ষায় বিভক্ত হয়ে গেছে (আমি মনে করি না যে ক্লায়েন্ট সাইড জেএসের সাথে আপনার এটি সম্পর্কে চিন্তা করতে হবে, তবে আপনার পৃষ্ঠাটি এতক্ষণ ঝুলতে হবে যা আপনার ভিজিটর আপনার সাইট ছেড়ে যায়)।

আমি দেখেছি এমন অন্য একটি ভান্ডার রয়েছে যা ডাইপারিনি / রেজেক্স-ওয়েবুরল.জে এস আইআরএল এর জন্য আরও ভাল হতে পারে তবে এটি অত্যন্ত জটিল। এটিতে বৈধ ও অবৈধ URL গুলির একটি বৃহত পরীক্ষার তালিকা রয়েছে। উপরের সরল একটিটি এখনও সমস্ত ধনাত্মক কেটে যায় এবং কেবল কয়েকটি অদ্ভুত negativeণাত্মক পছন্দকে আটকাতে ব্যর্থ হয়http://a.b--c.de/ বিশেষ আইপিএসের ।

আপনি যে কোনওটিকেই বেছে নিন, আপনার ব্রাউজারের বিকাশকারী সরঞ্জাম ইনপ্যাক্টর ব্যবহার করার সময় আমি এই ফাংশনটি দিয়ে চালান যা আমি dperini / regex-weburl.js এর পরীক্ষাগুলি থেকে গ্রহণ করেছি।

function testIsURL() {
//should match
console.assert(isURL("http://foo.com/blah_blah"));
console.assert(isURL("http://foo.com/blah_blah/"));
console.assert(isURL("http://foo.com/blah_blah_(wikipedia)"));
console.assert(isURL("http://foo.com/blah_blah_(wikipedia)_(again)"));
console.assert(isURL("http://www.example.com/wpstyle/?p=364"));
console.assert(isURL("https://www.example.com/foo/?bar=baz&inga=42&quux"));
console.assert(isURL("http://✪df.ws/123"));
console.assert(isURL("http://userid:password@example.com:8080"));
console.assert(isURL("http://userid:password@example.com:8080/"));
console.assert(isURL("http://userid@example.com"));
console.assert(isURL("http://userid@example.com/"));
console.assert(isURL("http://userid@example.com:8080"));
console.assert(isURL("http://userid@example.com:8080/"));
console.assert(isURL("http://userid:password@example.com"));
console.assert(isURL("http://userid:password@example.com/"));
console.assert(isURL("http://142.42.1.1/"));
console.assert(isURL("http://142.42.1.1:8080/"));
console.assert(isURL("http://➡.ws/䨹"));
console.assert(isURL("http://⌘.ws"));
console.assert(isURL("http://⌘.ws/"));
console.assert(isURL("http://foo.com/blah_(wikipedia)#cite-1"));
console.assert(isURL("http://foo.com/blah_(wikipedia)_blah#cite-1"));
console.assert(isURL("http://foo.com/unicode_(✪)_in_parens"));
console.assert(isURL("http://foo.com/(something)?after=parens"));
console.assert(isURL("http://☺.damowmow.com/"));
console.assert(isURL("http://code.google.com/events/#&product=browser"));
console.assert(isURL("http://j.mp"));
console.assert(isURL("ftp://foo.bar/baz"));
console.assert(isURL("http://foo.bar/?q=Test%20URL-encoded%20stuff"));
console.assert(isURL("http://مثال.إختبار"));
console.assert(isURL("http://例子.测试"));
console.assert(isURL("http://उदाहरण.परीक्षा"));
console.assert(isURL("http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com"));
console.assert(isURL("http://1337.net"));
console.assert(isURL("http://a.b-c.de"));
console.assert(isURL("http://223.255.255.254"));
console.assert(isURL("postgres://u:p@example.com:5702/db"));
console.assert(isURL("https://d1f4470da51b49289906b3d6cbd65074@app.getsentry.com/13176"));

//SHOULD NOT MATCH:
console.assert(!isURL("http://"));
console.assert(!isURL("http://."));
console.assert(!isURL("http://.."));
console.assert(!isURL("http://../"));
console.assert(!isURL("http://?"));
console.assert(!isURL("http://??"));
console.assert(!isURL("http://??/"));
console.assert(!isURL("http://#"));
console.assert(!isURL("http://##"));
console.assert(!isURL("http://##/"));
console.assert(!isURL("http://foo.bar?q=Spaces should be encoded"));
console.assert(!isURL("//"));
console.assert(!isURL("//a"));
console.assert(!isURL("///a"));
console.assert(!isURL("///"));
console.assert(!isURL("http:///a"));
console.assert(!isURL("foo.com"));
console.assert(!isURL("rdar://1234"));
console.assert(!isURL("h://test"));
console.assert(!isURL("http:// shouldfail.com"));
console.assert(!isURL(":// should fail"));
console.assert(!isURL("http://foo.bar/foo(bar)baz quux"));
console.assert(!isURL("ftps://foo.bar/"));
console.assert(!isURL("http://-error-.invalid/"));
console.assert(!isURL("http://a.b--c.de/"));
console.assert(!isURL("http://-a.b.co"));
console.assert(!isURL("http://a.b-.co"));
console.assert(!isURL("http://0.0.0.0"));
console.assert(!isURL("http://10.1.1.0"));
console.assert(!isURL("http://10.1.1.255"));
console.assert(!isURL("http://224.1.1.1"));
console.assert(!isURL("http://1.1.1.1.1"));
console.assert(!isURL("http://123.123.123"));
console.assert(!isURL("http://3628126748"));
console.assert(!isURL("http://.www.foo.bar/"));
console.assert(!isURL("http://www.foo.bar./"));
console.assert(!isURL("http://.www.foo.bar./"));
console.assert(!isURL("http://10.1.1.1"));}

এবং তারপরে 'এ'র স্ট্রিংটি পরীক্ষা করুন।

আপনি সম্ভবত আপাতদৃষ্টিতে দুর্দান্ত রেজেক্স পোস্ট করার আগে আরও তথ্যের জন্য ম্যাথিয়াস বাইেনেন্সের আইআরএল রেজেজের এই তুলনাটি দেখুন ।


আমি আপনার উত্তর চেক। আপনার উত্তরটি sdfasdp.ppppppppppp এর জন্য ব্যর্থ হচ্ছে অর্থাৎ সত্য প্রত্যাবর্তন করা হলেও প্রত্যাশিত মিথ্যা
বিকাশদীপ সিং

1
আমি মনে করি এটি কাঠামোগতভাবে একটি বৈধ URL। মানক বিশেষজ্ঞ নয় তবে আমি মনে করি না .কম অংশের দৈর্ঘ্যের কোনও সীমা রয়েছে (আমি জানি .অনলাইন বৈধ)।
এমার্কস

1
কয়েক মাস আগে আমি কীভাবে একটি রেজেক্স লিখতে হয়েছিল তা সবেমাত্র আমি জানতাম। সমস্যা মারাত্মক। আমি উদ্ধৃত isURL('a'.repeat(100))রেইগেক্স উভয়ই কয়েক মিলিয়ন / সেকেন্ড সম্পূর্ণ করতে পারি (ড্পারিনি থেকে আরও জটিলটি আসলে দ্রুততর হয়)। ফর্মের কয়েকটি উচ্চমানের উত্তর ([a-zA-Z] +) * একবারে এটি পূর্ণ হতে কয়েক ঘন্টা সময় নিতে পারে। আরও তথ্যের জন্য RegEx redos সন্ধান করুন।
এমার্কস

6

# 5717133 # এর নিকটতম পোস্টটিতে আমি মন্তব্য করতে পারছি না , তবে @ টম-গুলেন রেইগেক্স কীভাবে কাজ করবেন তা আমি নীচে নীচে।

/^(https?:\/\/)?((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|((\d{1,3}\.){3}\d{1,3}))(\:\d+)?(\/[-a-z\d%_.~+]*)*(\?[;&a-z\d%_.~+=-]*)?(\#[-a-z\d_]*)?$/i

2
এটি আমার পক্ষে কাজ করেছে তবে আমার ব্যাকস্ল্যাশগুলি ব্যাকস্ল্যাশ করা দরকার। var pattern = new RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');
ফার্নান্দো শ্যাভেজ হেরেরার

পরীক্ষা করে দেখুন w3resource.com/javascript-exercises/... আরো পরীক্ষার বিষয় জন্য
Kewal শাহ

5

ভ্যালিডেটর.জেএস ব্যবহার করুন

ES6

import isURL from 'validator/lib/isURL'

isURL(string)

ES6 নেই

var validator = require('validator');

validator.isURL(string)

Argumentচ্ছিক optionsবস্তুর দ্বিতীয় আর্গুমেন্ট হিসাবে পাস করে আপনি এই ফাংশনের আচরণকে সূক্ষ্ম করতে পারেনisURL

এখানে ডিফল্ট optionsঅবজেক্টটি রয়েছে:

let options = {
    protocols: [
        'http',
        'https',
        'ftp'
    ],
    require_tld: true,
    require_protocol: false,
    require_host: true,
    require_valid_protocol: true,
    allow_underscores: false,
    host_whitelist: false,
    host_blacklist: false,
    allow_trailing_dot: false,
    allow_protocol_relative_urls: false,
    disallow_auth: false
}

isURL(string, options)

host_whitelistএবং host_blacklistহোস্টের অ্যারে হতে পারে। এগুলি নিয়মিত মত প্রকাশের পক্ষেও সমর্থন করে।

let options = {
    host_blacklist: ['foo.com', 'bar.com'],
}

isURL('http://foobar.com', options) // => true
isURL('http://foo.bar.com/', options) // => true
isURL('http://qux.com', options) // => true

isURL('http://bar.com/', options) // => false
isURL('http://foo.com/', options) // => false


options = {
    host_blacklist: ['bar.com', 'foo.com', /\.foo\.com$/],
}

isURL('http://foobar.com', options) // => true
isURL('http://foo.bar.com/', options) // => true
isURL('http://qux.com', options) // => true

isURL('http://bar.com/', options) // => false
isURL('http://foo.com/', options) // => false
isURL('http://images.foo.com/', options) // => false
isURL('http://cdn.foo.com/', options) // => false
isURL('http://a.b.c.foo.com/', options) // => false

1
নিস! ছোট লাইব্রেরি (৪০ কিলোমিটারেরও কম নয়), জনপ্রিয় গ্রন্থাগার (এনপিএম-এ 3 এম সাপ্তাহিক ডাউনলোডগুলি) আপনাকে আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে ইউআরএলের বৈধতা নির্দিষ্টকরণের ক্ষেত্রে প্রচুর স্বাচ্ছন্দ্য দেয় এবং ইউআরএল ছাড়াও বেশ কয়েকটি অন্যান্য বৈধ লেখক রয়েছে। এটি এখন পর্যন্ত সেরা উত্তর, আইএমএইচও।
জাভিদ জামে ২

4

একটি ইউআরএল "স্ট্রিং" যাচাই করতে আমি যে ফাংশনটি ব্যবহার করছি তা হ'ল:

var matcher = /^(?:\w+:)?\/\/([^\s\.]+\.\S{2}|localhost[\:?\d]*)\S*$/;

function isUrl(string){
  return matcher.test(string);
}

এই ফাংশনটি কোনও বুলিয়ানকে ফিরিয়ে দেবে স্ট্রিংটি ইউআরএল কিনা।

উদাহরণ:

isUrl("https://google.com");     // true
isUrl("http://google.com");      // true
isUrl("http://google.de");       // true
isUrl("//google.de");            // true
isUrl("google.de");              // false
isUrl("http://google.com");      // true
isUrl("http://localhost");       // true
isUrl("https://sdfasd");         // false

4

খাঁটি রেজেক্সের সাথে এটি করা বেশ কঠিন কারণ ইউআরএলগুলির অনেকগুলি 'অসুবিধা' রয়েছে।

  1. উদাহরণস্বরূপ ডোমেন নামগুলির হাইফেনগুলির উপর জটিল বিধিনিষেধ রয়েছে:

    ক। এটি মাঝখানে টানা অনেক হাইফেন রাখার অনুমতি রয়েছে।

    খ। তবে ডোমেন নামের প্রথম অক্ষর এবং শেষ অক্ষর হাইফেন হতে পারে না

    গ। 3 য় এবং 4 র্থ অক্ষর উভয় হাইফেন হতে পারে না

  2. একইভাবে পোর্ট নম্বর কেবল 1-65535 এর মধ্যে থাকতে পারে। আপনি বন্দর অংশটি বের করেন এবং রূপান্তর করেছেন কিনা তা পরীক্ষা করা সহজ intতবে নিয়মিত অভিব্যক্তি দিয়ে পরীক্ষা করা বেশ কঠিন।

  3. বৈধ ডোমেন এক্সটেনশনগুলি চেক করার কোনও সহজ উপায় নেই। কিছু দেশে দ্বিতীয় স্তরের ডোমেন থাকে (যেমন 'কোকুক'), বা এক্সটেনশন দীর্ঘ শব্দ হতে পারে যেমন '। আন্তর্জাতিক'। এবং নিয়মিত নতুন টিএলডি যুক্ত করা হয়। এই ধরণের জিনিসগুলি কেবল একটি হার্ড-কোডেড তালিকার বিরুদ্ধে পরীক্ষা করা যায়। ( https://en.wikedia.org/wiki/Top-level_domain দেখুন )

  4. তারপরে ম্যাগনেট ইউআরএল, এফটিপি ঠিকানা ইত্যাদি রয়েছে are এগুলির সকলের আলাদা আলাদা প্রয়োজনীয়তা রয়েছে।

তবুও, এখানে এমন একটি ফাংশন রয়েছে যা বাদে বেশ কিছু সবকিছু পরিচালনা করে:

  • মামলা 1. গ
  • যে কোনও 1-5 সংখ্যার পোর্ট নম্বর গ্রহণ করে
  • যে কোনও এক্সটেনশন 2-13 অক্ষর গ্রহণ করে
  • Ftp, চৌম্বক ইত্যাদি গ্রহণ করে না ...

function isValidURL(input) {
    pattern = '^(https?:\\/\\/)?' + // protocol
        '((([a-zA-Z\\d]([a-zA-Z\\d-]{0,61}[a-zA-Z\\d])*\\.)+' + // sub-domain + domain name
        '[a-zA-Z]{2,13})' + // extension
        '|((\\d{1,3}\\.){3}\\d{1,3})' + // OR ip (v4) address
        '|localhost)' + // OR localhost
        '(\\:\\d{1,5})?' + // port
        '(\\/[a-zA-Z\\&\\d%_.~+-:@]*)*' + // path
        '(\\?[a-zA-Z\\&\\d%_.,~+-:@=;&]*)?' + // query string
        '(\\#[-a-zA-Z&\\d_]*)?$'; // fragment locator
    regex = new RegExp(pattern);
    return regex.test(input);
}

let tests = [];
tests.push(['', false]);
tests.push(['http://en.wikipedia.org/wiki/Procter_&_Gamble', true]);
tests.push(['https://sdfasd', false]);
tests.push(['http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707', true]);
tests.push(['https://stackoverflow.com/', true]);
tests.push(['https://w', false]);
tests.push(['aaa', false]);
tests.push(['aaaa', false]);
tests.push(['oh.my', true]);
tests.push(['dfdsfdsfdfdsfsdfs', false]);
tests.push(['google.co.uk', true]);
tests.push(['test-domain.MUSEUM', true]);
tests.push(['-hyphen-start.gov.tr', false]);
tests.push(['hyphen-end-.com', false]);
tests.push(['https://sdfasdp.international', true]);
tests.push(['https://sdfasdp.pppppppp', false]);
tests.push(['https://sdfasdp.ppppppppppppppppppp', false]);
tests.push(['https://sdfasd', false]);
tests.push(['https://sub1.1234.sub3.sub4.sub5.co.uk/?', true]);
tests.push(['http://www.google-com.123', false]);
tests.push(['http://my--testdomain.com', false]);
tests.push(['http://my2nd--testdomain.com', true]);
tests.push(['http://thingiverse.com/download:1894343', true]);
tests.push(['https://medium.com/@techytimo', true]);
tests.push(['http://localhost', true]);
tests.push(['localhost', true]);
tests.push(['localhost:8080', true]);
tests.push(['localhost:65536', true]);
tests.push(['localhost:80000', false]);
tests.push(['magnet:?xt=urn:btih:123', true]);

for (let i = 0; i < tests.length; i++) {
    console.log('Test #' + i + (isValidURL(tests[i][0]) == tests[i][1] ? ' passed' : ' failed') + ' on ["' + tests[i][0] + '", ' + tests[i][1] + ']');
}


1

আমি মনে করি @ প্যাভলো যেমন পরামর্শ দিয়েছেন তেমন একটি জটিল রেইগেক্স ধরণের চেয়ে নেটিভ ইউআরএল API ব্যবহার করা ভাল API এটিতে কিছু ত্রুটি রয়েছে যদিও আমরা কিছু অতিরিক্ত কোড দিয়ে এটি ঠিক করতে পারি। এই পদ্ধতিটি নিম্নলিখিত বৈধ url- এর জন্য ব্যর্থ।

//cdn.google.com/script.js

এটি এড়াতে আমরা অনুপস্থিত প্রোটোকলটি আগেই যুক্ত করতে পারি। এটি নিম্নলিখিত অবৈধ url সনাক্ত করতে ব্যর্থ।

http://w
http://..

তাহলে পুরো ইউআরএল কেন পরীক্ষা করে দেখুন? আমরা কেবল ডোমেনটি পরীক্ষা করতে পারি। আমি এখান থেকে ডোমেন যাচাই করার জন্য রেজেক্স ধার নিয়েছি ।

function isValidUrl(string) {
    if (string && string.length > 1 && string.slice(0, 2) == '//') {
        string = 'http:' + string; //dummy protocol so that URL works
    }
    try {
        var url = new URL(string);
        return url.hostname && url.hostname.match(/^([a-z0-9])(([a-z0-9-]{1,61})?[a-z0-9]{1})?(\.[a-z0-9](([a-z0-9-]{1,61})?[a-z0-9]{1})?)?(\.[a-zA-Z]{2,4})+$/) ? true : false;
    } catch (_) {
        return false;
    }
}

hostnameঅ্যাট্রিবিউট জন্য খালি স্ট্রিং javascript:void(0), তাই এটি খুব যে জন্য কাজ করে, এবং আপনি যাচাইকারী খুব IP ঠিকানা যোগ করতে পারেন। আমি নেটিভ API এর সর্বাধিক লেগে থাকতে চাই এবং আশা করি এটি অদূর ভবিষ্যতে সবকিছু সমর্থন করা শুরু করে।


আকর্ষণীয়, তবে এখনও রেজিজেসে কাজ করার প্রয়োজন হতে পারে কারণ এটি এখন মিথ্যা নেতিবাচকভাবে প্রবর্তিত হয়েছে যা new URLআমার পরীক্ষাগুলিতে নেই। এটি কল করছে: http://142.42.1.1 //falseএবং উচ্চ ইউনিকোড স্ট্রিংগুলি ব্লক করছে।
এমার্কস

1

প্রশ্ন যেমন url এর জন্য একটি বৈধতা পদ্ধতি জিজ্ঞাসা করে stackoverflow হোস্টনামের প্রোটোকল বা কোনও বিন্দু ছাড়াই । সুতরাং, এটি ইউআরএল সিনট্যাক্স যাচাই করার বিষয় নয়, এটি প্রকৃতপক্ষে ফোন করে এটি কোনও বৈধ url কিনা তা পরীক্ষা করা।

ইউআরএলটি সত্য রয়েছে কিনা এবং ব্রাউজারের মধ্যে থেকে কলযোগ্য কিনা তা জানার জন্য আমি বেশ কয়েকটি পদ্ধতির চেষ্টা করেছি, তবে জাভাস্ক্রিপ্টের মাধ্যমে পরীক্ষার কোনও উপায় খুঁজে পাইনি কলটির প্রতিক্রিয়া শিরোনাম:

  • নোঙ্গর উপাদান যুক্ত করা গুলি ফায়ার জন্য ঠিক আছে click() পদ্ধতি ।
  • চ্যালেঞ্জিং ইউআরএলের সাথে এজাক্স কল করা 'GET'ভাল, তবে CORSনীতিমালাগুলির কারণে এটির বিভিন্ন সীমাবদ্ধতা রয়েছে এবং এটি ব্যবহারের ক্ষেত্রে নয় usingajax , কারণ ইউআরএল হিসাবে আমার সার্ভারের ডোমেনের বাইরের কোনও অংশ থাকতে পারে।
  • ফেচ এপিআই ব্যবহার করে অ্যাজাক্সের মতো একই কাজ রয়েছে।
  • অন্য সমস্যাটি হ'ল আমার সার্ভারটি httpsপ্রোটোকলের অধীনে রয়েছে এবং নিরাপদ ইউআরএলগুলি কল করার সময় একটি ব্যতিক্রম ছুঁড়ে দেয়।

সুতরাং, আমি যে সর্বোত্তম সমাধানটির কথা ভাবতে পারি তা হল CURLজাভাস্ক্রিপ্ট ব্যবহার করে কিছু করার চেষ্টা করার মতো কোনও সরঞ্জাম পেয়ে যাওয়া curl -I <url>। দুর্ভাগ্যক্রমে আমি কোনও খুঁজে পেলাম না এবং উপলব্ধিতে এটি সম্ভব নয়। আমি এই সম্পর্কে কোন মন্তব্য প্রশংসা করব।

তবে শেষ পর্যন্ত আমার একটি সার্ভার চলছে PHP এবং প্রায় আমার সমস্ত অনুরোধের জন্য আমি আজাক্স ব্যবহার করার সাথে সাথে সেখানে কার্ল অনুরোধটি সম্পাদন করতে এবং ব্রাউজারে ফিরে আসার জন্য আমি সার্ভার সাইডে একটি ফাংশন লিখেছিলাম।

'স্ট্যাকওভারফ্লো' প্রশ্নে একক শব্দ url সম্পর্কে এটি আমাকে নিয়ে যাবে https://daniserver.com.ar/stackoverflow, যেখানে ড্যানিসভার ডট কম.আর আমার নিজস্ব ডোমেন।


ওপি সম্ভবত তাঁর অভিপ্রায়টি আরও বেশি বোঝা উচিত ছিল। সমস্যাটি অবশ্যই আপনার প্রয়োজনগুলির উপর নির্ভর করে এবং মিথ্যা ধনাত্মকতা বাদ দেওয়া বা মিথ্যা নেতিবাচক বিষয় অন্তর্ভুক্ত করা আরও গুরুত্বপূর্ণ কিনা। সমস্যাটি হিসাবে বর্ণনা করা হয়েছে বলে মনে হচ্ছে আমার কাছে কোনও উত্তর নেই। আপনি কি সত্যিই fooএটি HTTP বা https বা .com বা .es বা অগণিত প্রত্যয়গুলির কোনওটি নিতে এবং ধরে নিতে পারেন ? আপনি সত্য না পাওয়া পর্যন্ত আপনি কি রান্নাঘরের সিঙ্কটি ফেলে দিচ্ছেন?
এমার্কস

1

এটি সিএসের অন্যতম কঠিন সমস্যা বলে মনে হচ্ছে;)

এখানে অন্য একটি অসম্পূর্ণ সমাধান যা আমার পক্ষে যথেষ্ট ভাল এবং আমি এখানে অন্যদের চেয়ে আরও ভাল কাজ করে। আইই ১১ সমর্থন করার জন্য আমি এর জন্য একটি ইনপুট [টাইপ = ইউআরএল] ব্যবহার করছি, অন্যথায় এটি উইন্ডো ব্যবহার করে অনেক সহজ হবে URL URL পরিবর্তে বৈধতা সম্পাদন করার জন্য:

const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
function isValidIpv4(ip) {
  if (!ipv4Regex.test(ip)) return false;
  return !ip.split('.').find(n => n > 255);
}

const domainRegex = /(?:[a-z0-9-]{1,63}\.){1,125}[a-z]{2,63}$/i;
function isValidDomain(domain) {
  return isValidIpv4(domain) || domainRegex.test(domain);
}

let input;
function validateUrl(url) {
  if (! /^https?:\/\//.test(url)) url = `http://${url}`; // assuming Babel is used
  // to support IE11 we'll resort to input[type=url] instead of window.URL:
  // try { return isValidDomain(new URL(url).host) && url; } catch(e) { return false; }
  if (!input) { input = document.createElement('input'); input.type = 'url'; }
  input.value = url;
  if (! input.validity.valid) return false;
  const domain = url.split(/^https?:\/\//)[1].split('/')[0].split('@').pop();
  return isValidDomain(domain) && url;
}

console.log(validateUrl('google'), // false
  validateUrl('user:pw@mydomain.com'),
  validateUrl('https://google.com'),
  validateUrl('100.100.100.100/abc'),
  validateUrl('100.100.100.256/abc')); // false

"Www.mydomain.com" এর মতো অসম্পূর্ণ ইনপুট গ্রহণ করার জন্য সেই ক্ষেত্রে প্রোটোকলটি "HTTP" হিসাবে ধরে নেওয়া এবং ঠিকানা বৈধ হলে বৈধ URL টি প্রদান করে তা বৈধ করে তুলবে। এটি অবৈধ হলে মিথ্যা ফেরত দেয়।

এটি আইপিভি 4 ডোমেনগুলি সমর্থন করে তবে আইপিভি 6 নয়।


1

আমার ক্ষেত্রে আমার একমাত্র প্রয়োজন হ'ল কোনও ট্যাগের href এ রাখার সময় ব্যবহারকারীর ইনপুটটিকে আপেক্ষিক লিঙ্ক হিসাবে ব্যাখ্যা করা হবে না এবং এখানে উত্তরগুলি এর জন্য কিছুটা ওটিটি ছিল বা URL গুলি আমার প্রয়োজনীয়তা পূরণ করছে না, সুতরাং এটি আমি যা করছি তার সাথে:

^https?://.+$

রেজেক্স ছাড়াই একই জিনিসটি খুব সহজেই অর্জন করা যায়।


1

এই আমার সাথে কাজ

function isURL(str) {
  var regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
  var pattern = new RegExp(regex); 
return pattern.test(str);
}

1
এই উত্তরটি ইতিমধ্যে 4 বছর আগে কবিতা রেড্ডি দিয়েছিলেন।
aamark

আমি এটিকে আরও সহজ এবং বিমূর্তভাবে তৈরি করেছি
হেশামসালামা

1

আপনি যদি ইনপুট প্রকারটি পরিবর্তন করতে পারেন তবে আমি মনে করি এই সমাধানটি আরও সহজ হবে:

আপনি type="url"নিজের ইনপুটটিতে সাধারণ ব্যবহার করতে পারেন এবং এটি দিয়ে পরীক্ষা করে দেখুনcheckValidity() জেএসে

উদাহরণ:

your.html

<input id="foo" type="url">

your.js

// The selector is JQuery, but the function is plain JS
$("#foo").on("keyup", function() {
    if (this.checkValidity()) {
        // The url is valid
    } else {
        // The url is invalid
    }
});

1

এটি ত্রুটিপূর্ণভাবে সবচেয়ে কার্যকর পদ্ধতির নয়, তবে এটি আপনার যা প্রয়োজন তা পূরণ করার জন্য এটি পাঠযোগ্য এবং সহজ easy এবং এখান থেকে রেজেক্স / জটিলতা যুক্ত করা আরও সহজ। সুতরাং এখানে একটি খুব ব্যবহারিক পদ্ধতির

const validFirstBits = ["ftp://", "http://", "https://", "www."];
const invalidPatterns = [" ", "//.", ".."];

export function isUrl(word) {
// less than www.1.dk
if (!word || word.length < 8) return false;

// Let's check and see, if our candidate starts with some of our valid first bits
const firstBitIsValid = validFirstBits.some(bit => word.indexOf(bit) === 0);
if (!firstBitIsValid) return false;

const hasInvalidPatterns = invalidPatterns.some(
    pattern => word.indexOf(pattern) !== -1,
);

if (hasInvalidPatterns) return false;

const dotSplit = word.split(".");
if (dotSplit.length > 1) {
    const lastBit = dotSplit.pop(); // string or undefined
    if (!lastBit) return false;
    const length = lastBit.length;
    const lastBitIsValid =
        length > 1 || (length === 1 && !isNaN(parseInt(lastBit)));
    return !!lastBitIsValid;
}

    return false;
}

পরীক্ষা:

import { isUrl } from "./foo";

describe("Foo", () => {
    test("should validate correct urls correctly", function() {
        const validUrls = [
            "http://example.com",
            "http://example.com/blah",
            "http://127.0.0.1",
            "http://127.0.0.1/wow",
            "https://example.com",
            "https://example.com/blah",
            "https://127.0.0.1:1234",
            "ftp://example.com",
            "ftp://example.com/blah",
            "ftp://127.0.0.1",
            "www.example.com",
            "www.example.com/blah",
        ];

        validUrls.forEach(url => {
            expect(isUrl(url) && url).toEqual(url);
        });
    });

    test("should validate invalid urls correctly", function() {
        const inValidUrls = [
            "http:// foo.com",
            "http:/foo.com",
            "http://.foo.com",
            "http://foo..com",
            "http://.com",
            "http://foo",
            "http://foo.c",
        ];

        inValidUrls.forEach(url => {
            expect(!isUrl(url) && url).toEqual(url);
        });
    });
});

1

ম্যাথিয়াস ব্যেনেন্স সুপরিচিত ইউআরএল রেজিেক্সগুলির একটি তালিকা তৈরি করেছেন পরীক্ষিত ইউআরএল সহ । নতুন নিয়মিত অভিব্যক্তি লেখার খুব কম কারণ রয়েছে; কেবলমাত্র এমন একটি বিদ্যমান চয়ন করুন যা আপনার পক্ষে সবচেয়ে উপযুক্ত su

তবে এই রেজিওসের জন্য তুলনা সারণীটিও দেখায় যে একক নিয়মিত প্রকাশের সাথে ইউআরএল বৈধতা পাওয়া অসম্ভবের পরে। বেনেন্সের তালিকার সমস্ত রেইগেক্সগুলি মিথ্যা ধনাত্মক এবং মিথ্যা নেতিবাচক উত্পাদন করে।

আমি প্রস্তাব দিচ্ছি যে আপনি একটি বিদ্যমান ইউআরএল পার্সার ব্যবহার করুন (উদাহরণস্বরূপ new URL('http://www.example.com/')জাভাস্ক্রিপ্টে) এবং তারপরে আপনি ইউআরএল রেফের পার্সড এবং নরমালাইজড ফর্মটির বিরুদ্ধে যে চেকগুলি সম্পাদন করতে চান তা প্রয়োগ করুন। এর উপাদানগুলি। জাভাস্ক্রিপ্ট URLইন্টারফেসটি ব্যবহার করার অতিরিক্ত সুবিধা রয়েছে যা এটি কেবলমাত্র এমন ইউআরএল গ্রহণ করবে যা ব্রাউজার দ্বারা সত্যই স্বীকৃত।

আপনার এও মনে রাখা উচিত যে প্রযুক্তিগতভাবে ভুল URL গুলি এখনও কাজ করতে পারে। উদাহরণ হিসেবে বলা যায় http://w_w_w.example.com/, http://www..example.com/, http://123.example.com/সব একটি অবৈধ হোস্ট-নেম অংশ আছে কিন্তু প্রতিটি ব্রাউজারের আমি জানি অভিযোগ ছাড়াই খোলার চেষ্টা হবে, এবং আপনি ঐ অবৈধ নামের জন্য IP ঠিকানা উল্লেখ যখন/etc/hosts/ যেমন URL গুলি এমনকি কাজ করবে কিন্তু শুধুমাত্র আপনার কম্পিউটারের তে।

প্রশ্নটি তাই কোনও ইউআরএল বৈধ কিনা তা নয়, বরং কোন ইউআরএলগুলি কাজ করে এবং কোনও নির্দিষ্ট প্রসঙ্গে অনুমতি দেওয়া উচিত।

আপনি যদি URL টি যাচাইকরণ করতে চান তবে এখানে অনেকগুলি বিবরণ এবং প্রান্তের কেস রয়েছে যা উপেক্ষা করা সহজ:

  • ইউআরএলগুলিতে যেমন শংসাপত্র থাকতে পারে http://user:password@www.example.com/
  • বন্দর নম্বরগুলি অবশ্যই 0-65535 এর মধ্যে থাকতে হবে তবে আপনি এখনও ওয়াইল্ডকার্ড পোর্ট 0 বাদ দিতে চাইতে পারেন।
  • বন্দর নম্বরগুলিতে http://www.example.com:000080/ হিসাবে নেতৃস্থানীয় শূন্য থাকতে পারে
  • আইপিভি 4 অ্যাড্রেসগুলি কোনওভাবেই 0-255 এর মধ্যে 4 দশমিক পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ নয়। আপনি এক থেকে চারটি পূর্ণসংখ্যার ব্যবহার করতে পারেন এবং সেগুলি দশমিক, অক্টাল বা হেক্সাডেসিমাল হতে পারে। URL গুলি HTTPS: //010.010.000010.010/ , HTTPS: //0x8.0x8.0x0008.0x8/ , HTTPS: //8.8.2056/ , HTTPS: //8.526344/ , HTTPS: // 134744072 / সকল বৈধ এবং https://8.8.8.8/ লেখার সৃজনশীল উপায়গুলি ।
  • লুপব্যাক ঠিকানা ( http://127.0.0.1/ ), ব্যক্তিগত আইপি ঠিকানাগুলি ( http://192.168.1.1 ), লিংক-স্থানীয় ঠিকানাগুলি ( http://169.254.100.200 ) এবং এর ফলে সুরক্ষার উপর প্রভাব ফেলতে পারে বা গোপনীয়তা। উদাহরণস্বরূপ, যদি আপনি তাদের কোনও ফোরামে ব্যবহারকারী অবতারের ঠিকানা হিসাবে অনুমতি দেন তবে আপনি ব্যবহারকারীদের ব্রাউজারগুলিকে তাদের স্থানীয় নেটওয়ার্কে এবং ইন্টারনেটের ইন্টারনেটে অনাকাঙ্ক্ষিত নেটওয়ার্কের অনুরোধগুলি প্রেরণের কারণ হিসাবে এই জাতীয় অনুরোধগুলি মজার এবং এত মজার বিষয় নাও হতে পারে আপনার বাড়িতে ঘটবে।
  • একই কারণে, আপনি সম্পূর্ণরূপে যোগ্য হোস্টনামের লিঙ্কগুলি বাতিল করতে চাইতে পারেন, অন্য কথায় বিন্দু ছাড়াই হোস্টনাম।
  • তবে হোস্ট-নেমগুলির সর্বদা একটি পিছনের বিন্দু থাকতে পারে (এর মতো http://www.stackoverflow.com.)।
  • কোনও লিঙ্কের হোস্টনাম অংশে http: // [:: 1] হিসাবে IPv6 ঠিকানার জন্য কোণ বন্ধনী থাকতে পারে
  • আইপিভি addresses ঠিকানার মধ্যে ব্যক্তিগত নেটওয়ার্ক বা লিংক-স্থানীয় ঠিকানা ইত্যাদির ব্যাপ্তিও রয়েছে etc.
  • যদি আপনি নির্দিষ্ট আইপিভি 4 ঠিকানাগুলি অবরুদ্ধ করেন তবে মনে রাখবেন যে https://127.0.0.1 এবং https: // [:: ffff: 127.0.0.1] একই উত্সটিতে নির্দেশ করুন (যদি আপনার মেশিনের লুপব্যাক ডিভাইস আইপিভি 6 প্রস্তুত থাকে তবে )।
  • ইউআরএলগুলির হোস্টনাম অংশে এখন ইউনিকোড থাকতে পারে, যাতে অক্ষরের পরিসরটি [-0-9a-zA-z]অবশ্যই যথেষ্ট পর্যাপ্ত থাকে না।
  • শীর্ষ-স্তরের ডোমেনগুলির জন্য অনেকগুলি রেজিস্ট্রেশন নির্দিষ্ট সীমাবদ্ধতাগুলি সংজ্ঞায়িত করে, উদাহরণস্বরূপ, ইউনিকোড অক্ষরের অনুমোদিত সেটগুলিতে। অথবা তারা তাদের নাম স্থানটি মহকুমা (যেমন co.ukএবং অনেকগুলি)।
  • শীর্ষ স্তরের ডোমেনগুলিতে অবশ্যই দশমিক সংখ্যা থাকা উচিত নয় এবং আইডিএন এ-লেবেল উপসর্গ "xn--" না থাকলে হাইফেনের অনুমতি দেওয়া হবে না।
  • ইউনিকোড শীর্ষ-স্তরের ডোমেনগুলি (এবং তাদের "xn--" দিয়ে পিউকোড এনকোডিং করা আছে) এখনও কেবলমাত্র অক্ষর থাকতে পারে তবে কে এটি একটি রেজিজেসে পরীক্ষা করতে চায়?

এই সীমাবদ্ধতা এবং বিধিগুলির মধ্যে কোনটি প্রয়োগ করা প্রকল্পের প্রয়োজনীয়তা এবং স্বাদ নিয়ে প্রশ্ন।

আমি সম্প্রতি একটি ওয়েব অ্যাপ্লিকেশনটির জন্য একটি ইউআরএল শংসাপত্র লিখেছি যা ফোরাম, সামাজিক নেটওয়ার্ক বা এর মতো ব্যবহারকারী-সরবরাহ করা ইউআরএলগুলির জন্য উপযুক্ত। এটিকে আপনার নিজস্ব ভিত্তি হিসাবে নির্দ্বিধায় ব্যবহার করুন:

আমি আরও একটি গভীর তথ্য সহ ইউআরএল ভ্যালিডেশন এর Gory বিবরণ একটি ব্লগ পোস্ট লিখেছি ।


1

আমি ফাংশনটি ম্যাচ + এ পরিবর্তন করব এবং এখানে স্ল্যাশ এবং এর কাজের সাথে একটি পরিবর্তন করব: (http: // এবং https) উভয়ই

function isValidUrl(userInput) {
    var res = userInput.match(/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g);
    if(res == null)
       return false;
    else
       return true;
}

0

একটি বৈধ প্রোটোকল আছে তা নিশ্চিত করার জন্য এখানে কেবলমাত্র একটি সাধারণ চেক এবং ডোমেন এক্সটেনশানটি অবশ্যই দু'একটি বেশি অক্ষর হওয়া উচিত।

is_valid_url = ( $url ) => {

    let $url_object = null;

    try {
        $url_object = new URL( $url );
    } catch ( $error ) {
        return false;
    }

    const $protocol = $url_object.protocol;
    const $protocol_position = $url.lastIndexOf( $protocol );
    const $domain_extension_position = $url.lastIndexOf( '.' );

    return (
        $protocol_position === 0 &&
        [ 'http:', 'https:' ].indexOf( $protocol ) !== - 1 &&
        $domain_extension_position > 2 && $url.length - $domain_extension_position > 2
    );

};

0

যদি https://localhost:3000আপনারও সমর্থন প্রয়োজন হয় তবে [ডেভশেড] এর রেজেক্সের এই পরিবর্তিত সংস্করণটি ব্যবহার করুন।

    function isURL(url) {
        if(!url) return false;
        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
            'localhost' + // OR localhost
            '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
            '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
            '(\\#[-a-z\\d_]*)?$', 'i'); // fragment locator
        return pattern.test(url);
    }

0

ইউআরএল কনস্ট্রাক্টর ব্যবহার করে বেশ কয়েকটি পরীক্ষা রয়েছে যা ইনপুটটি স্ট্রিং বা ইউআরএল অবজেক্ট কিনা তা বর্ণিত করে না।

// Testing whether something is a URL
function isURL(url) {
    return toString.call(url) === "[object URL]";
}

// Testing whether the input is both a string and valid url:
function isUrl(url) {
    try {
        return toString.call(url) === "[object String]" && !!(new URL(url));
    } catch (_) {
        return false;  
    }
}

0

2020 আপডেট। @ আইমনেউটন এবং @ ফার্নান্দো শ্যাভেজ হেরেরার কাছ থেকে চমৎকার উত্তর দুটিই প্রসারিত করার জন্য আমি @ইউআরএল-এর পথে ব্যবহৃত হতে দেখা শুরু করেছি ।

সুতরাং আপডেট করা রেজেক্সটি হ'ল:

RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+@]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');

আপনি যদি ক্যোয়ারী স্ট্রিং এবং হ্যাশে এটির অনুমতি দিতে চান তবে ব্যবহার করুন:

RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+@]*)*(\\?[;&a-z\\d%_.~+=-@]*)?(\\#[-a-z\\d_@]*)?$', 'i');

এটি বলা হচ্ছে, @কোয়েরি স্ট্রিং বা হ্যাশটিতে কোনও হোয়াইটপেপার নিয়মকে মঞ্জুর করা হচ্ছে কিনা তা আমি নিশ্চিত নই ।


0

ইতিমধ্যে প্রচুর উত্তর রয়েছে, তবে এখানে আরও একটি অবদান রয়েছে: URLপলিফিলের বৈধতা চেক থেকে সরাসরি নেওয়া, ব্রাউজারের অন্তর্নির্মিত বৈধতা যাচাইয়ের সুবিধা নিতে একটি inputউপাদান ব্যবহার করুন type="url":

var inputElement = doc.createElement('input');
inputElement.type = 'url';
inputElement.value = url;

if (!inputElement.checkValidity()) {
    throw new TypeError('Invalid URL');
}

উৎস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.