জাভাস্ক্রিপ্ট সহ পাঠ্য URL গুলি সনাক্ত করুন


151

স্ট্রিংয়ের সেটগুলিতে ইউআরএল সনাক্ত করার জন্য কারও কাছে পরামর্শ রয়েছে?

arrayOfStrings.forEach(function(string){
  // detect URLs in strings and do something swell,
  // like creating elements with links.
});

আপডেট: লিংক সনাক্তকরণের জন্য আমি এই রেজেক্সটি ব্যবহার করে আহত হয়েছি ... দৃশ্যত বেশ কয়েক বছর পরে।

kLINK_DETECTION_REGEX = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi

সম্পূর্ণ সহায়ক ( alচ্ছিক হ্যান্ডলবার্স সমর্থন সহ) সংক্ষেপে # 1654670


11
টিএলডি-র একটি সীমাবদ্ধ তালিকা তৈরি করার চেষ্টা করা সম্ভবত ভাল ধারণা নয়, যেহেতু তারা নতুন তৈরি করে চলেছে।
ম্যাক্সি-বি

একমত। কখনও কখনও আমাদের প্রয়োজন টিএলডি সহ আপডেট-সক্ষম কোড। কোডে টিএলডিকে রেজিজেস বা গতিশীল কোড আপডেটের টিএলডিগুলিতে সংযুক্ত করার জন্য বিল্ড স্ক্রিপ্ট হতে পারে। জীবনে এমন কিছু জিনিস রয়েছে যার অর্থ টিএলডি এবং টাইমজোনের মতো মানিক হওয়া উচিত। রিয়েল ওয়ার্ল্ড ঠিকানা ব্যবহারের ক্ষেত্রে বিদ্যমান "টিএলডি" যাচাইযোগ্য URL টি যাচাই করার জন্য সসীম নিয়ন্ত্রণ ভাল হতে পারে।
এডওয়ার্ড চ্যান জেডাব্লু

উত্তর:


217

প্রথমে আপনার একটি ভাল রেজেক্স দরকার যা ইউআরএলগুলির সাথে মেলে। এটি করা কঠিন। দেখুন এখানে , এখানে এবং এখানে :

... প্রায় কোনও কিছুরই একটি বৈধ URL। এটিকে বিভক্ত করার জন্য কিছু বিরাম বিধান রয়েছে। কোনও বিরামচিহ্ন অনুপস্থিত, আপনার এখনও একটি বৈধ URL আছে।

আরএফসি সাবধানে দেখুন এবং দেখুন যে আপনি একটি "অবৈধ" ইউআরএল তৈরি করতে পারেন কিনা। নিয়মগুলি খুব নমনীয়।

উদাহরণস্বরূপ :::::একটি বৈধ ইউআরএল। পথটি ":::::"। একটি দুর্দান্ত বোকামি ফাইল নাম, তবে একটি বৈধ ফাইলের নাম।

এছাড়াও, /////একটি বৈধ ইউআরএল। নেটলোক ("হোস্টনাম") ""। পথটি "///"। আবার, বোকা। বৈধ। এই ইউআরএলটি "///" সমতুল্য যা স্বাভাবিক করে তোলে।

এর মতো "bad://///worse/////" কিছু পুরোপুরি বৈধ। বোবা তবে বৈধ।

যাইহোক, এই উত্তরটি আপনাকে সেরা রেইগেক্স দেওয়ার জন্য নয় বরং জাভাস্ক্রিপ্ট সহ টেক্সটের অভ্যন্তরে স্ট্রিং মোড়ানো কীভাবে করা যায় তার একটি প্রমাণ দেওয়া।

ঠিক আছে সুতরাং এটি একটি ব্যবহার করুন: /(https?:\/\/[^\s]+)/g

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

function urlify(text) {
  var urlRegex = /(https?:\/\/[^\s]+)/g;
  return text.replace(urlRegex, function(url) {
    return '<a href="' + url + '">' + url + '</a>';
  })
  // or alternatively
  // return text.replace(urlRegex, '<a href="$1">$1</a>')
}

var text = 'Find me at http://www.example.com and also at http://stackoverflow.com';
var html = urlify(text);

console.log(html)

// html now looks like:
// "Find me at <a href="http://www.example.com">http://www.example.com</a> and also at <a href="http://stackoverflow.com">http://stackoverflow.com</a>"

সংক্ষেপে চেষ্টা করুন:

$$('#pad dl dd').each(function(element) {
    element.innerHTML = urlify(element.innerHTML);
});

4
"অনেক মিথ্যা ধনাত্মক" এর কয়েকটি উদাহরণ এই উত্তরটির ব্যাপক উন্নতি করবে। অন্যথায় ভবিষ্যতের গুগলারের কিছু (সম্ভবত বৈধ?) এফইউডি দিয়ে বাকি রয়েছে।
সে.এম.সি.কুলোহ

আমি কখনই জানতাম না যে আপনি .replaceএর জন্য দ্বিতীয় পরম হিসাবে ফাংশনটি পাস করতে পারেন : |
আমির আফ্রিদি

4
এটি ভাল, তবে এটি "ভুল" কাজটি পেছনের বিরামচিহ্নের সাথে text="Find me at http://www.example.com, and also at http://stackoverflow.com."দুটি 404 এর ফলাফল করে। কিছু ব্যবহারকারী এটি সম্পর্কে সচেতন এবং বিরতি এড়ানোর জন্য বিরামচিহ্নের পূর্বে ইউআরএলগুলির পরে একটি স্থান যুক্ত করবে, তবে বেশিরভাগ লিঙ্কিফায়ার আমি (জিমেইল, ইথারপ্যাড, ফ্যাব্রিকেটর) ইউআরএল থেকে পৃথক ট্র্যাকিং বিরামচিহ্ন ব্যবহার করি।
skierpage

যদি পাঠ্যটিতে ইতিমধ্যে অ্যাঙ্করড ইউআরএল থাকে আপনি ফাংশন রিমুভ অ্যাঙ্কারস (পাঠ্য) ব্যবহার করতে পারেন div var Div = $ ('<div> </div>') .html (পাঠ্য); div.find ( 'একটি') বিষয়বস্তু () মোড়ক খোলা ()।। রিটার্ন ডিভ টেক্সট (); return প্রথমে ফেরত পাঠানোর আগে অ্যাঙ্করগুলি সরিয়ে ফেলার জন্য.প্লেস
মুনিব মীর্জা

যদি পাঠ্যে ইতিমধ্যে অ্যাঙ্করড ইউআরএল থাকে, আপনি অ্যাঙ্কর সরানোর জন্য jquery ব্যবহার করছেন তবে আমি কৌনিক ব্যবহার করছি। আমি কৌণিকের অ্যাঙ্করটি কীভাবে সরাতে পারি?
শচীন জগতাপ

132

আমার রেজেক্স হিসাবে আমি এখানে যা শেষ করেছি:

var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;

এর মধ্যে URL এ চলমান বিরামচিহ্ন অন্তর্ভুক্ত নয়। ক্রিসেন্টের কাজটি কবজের মতো কাজ করে :) তাই:

function linkify(text) {
    var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(urlRegex, function(url) {
        return '<a href="' + url + '">' + url + '</a>';
    });
}

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

6
সহজ এবং সুন্দর! কিন্তু urlRegexসংজ্ঞায়িত করা উচিত বাহিরে linkify সংকলন এটি ব্যয়বহুল হিসাবে।
বিএম

1
এটি পুরো ইউআরএল সনাক্ত করতে ব্যর্থ: disney.wikia.com/wiki/Pua_(Moana)
Jry9972

1
আমি ()অক্ষরের প্রতিটি তালিকায় যুক্ত করেছি এবং এটি এখন কাজ করে।
গিলিয়াম এফ।

3
এটি কেবল www দিয়ে শুরু করে একটি url সনাক্ত করতে ব্যর্থ।
উদাহরণস্বরূপ

51

আমি বেশ কিছুক্ষণ এই সমস্যাটি গুগল করেছিলাম, তারপরে আমার কাছে এমনটি ঘটেছিল যে একটি অ্যান্ড্রয়েড পদ্ধতি রয়েছে, android.text.util.Linkify, যা এটি সম্পাদন করতে বেশ সুন্দর দৃ re় রেজেক্সেসকে কাজে লাগায়। ভাগ্যক্রমে, অ্যান্ড্রয়েড ওপেন সোর্স।

বিভিন্ন ধরণের url মেলানোর জন্য তারা কয়েকটি আলাদা নিদর্শন ব্যবহার করে। আপনি এগুলি এখানে সমস্ত খুঁজে পেতে পারেন: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Regex.java#Regex। 0WEB_URL_PATTERN

আপনি যদি কেবল ইউআরএল-এর সাথে মেলে যা WEB_URL_PATTERN এর সাথে মেলে, অর্থাৎ, ইউআরএলগুলি যে আরএফসি 1738 স্পেশালটি মেনে চলে, আপনি এটি ব্যবহার করতে পারেন:

/((?:(http|https|Http|Https|rtsp|Rtsp):\/\/(?:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,64}(?:\:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,25})?\@)?)?((?:(?:[a-zA-Z0-9][a-zA-Z0-9\-]{0,64}\.)+(?:(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(?:biz|b[abdefghijmnorstvwyz])|(?:cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(?:edu|e[cegrstu])|f[ijkmor]|(?:gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(?:info|int|i[delmnoqrst])|(?:jobs|j[emop])|k[eghimnrwyz]|l[abcikrstuvy]|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])|(?:name|net|n[acefgilopruz])|(?:org|om)|(?:pro|p[aefghklmnrstwy])|qa|r[eouw]|s[abcdeghijklmnortuvyz]|(?:tel|travel|t[cdfghjklmnoprtvwz])|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]))|(?:(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])))(?:\:\d{1,5})?)(\/(?:(?:[a-zA-Z0-9\;\/\?\:\@\&\=\#\~\-\.\+\!\*\'\(\)\,\_])|(?:\%[a-fA-F0-9]{2}))*)?(?:\b|$)/gi;

উত্সটির সম্পূর্ণ পাঠ্য এখানে:

"((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
+ "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
+ "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?"
+ "((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+"   // named host
+ "(?:"   // plus top level domain
+ "(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])"
+ "|(?:biz|b[abdefghijmnorstvwyz])"
+ "|(?:cat|com|coop|c[acdfghiklmnoruvxyz])"
+ "|d[ejkmoz]"
+ "|(?:edu|e[cegrstu])"
+ "|f[ijkmor]"
+ "|(?:gov|g[abdefghilmnpqrstuwy])"
+ "|h[kmnrtu]"
+ "|(?:info|int|i[delmnoqrst])"
+ "|(?:jobs|j[emop])"
+ "|k[eghimnrwyz]"
+ "|l[abcikrstuvy]"
+ "|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])"
+ "|(?:name|net|n[acefgilopruz])"
+ "|(?:org|om)"
+ "|(?:pro|p[aefghklmnrstwy])"
+ "|qa"
+ "|r[eouw]"
+ "|s[abcdeghijklmnortuvyz]"
+ "|(?:tel|travel|t[cdfghjklmnoprtvwz])"
+ "|u[agkmsyz]"
+ "|v[aceginu]"
+ "|w[fs]"
+ "|y[etu]"
+ "|z[amw]))"
+ "|(?:(?:25[0-5]|2[0-4]" // or ip address
+ "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]"
+ "|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]"
+ "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
+ "|[1-9][0-9]|[0-9])))"
+ "(?:\\:\\d{1,5})?)" // plus option port number
+ "(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~"  // plus option query params
+ "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
+ "(?:\\b|$)";

আপনি যদি সত্যিই অভিনব হতে চান তবে আপনি ইমেল ঠিকানার জন্যও পরীক্ষা করতে পারেন। ইমেল ঠিকানাগুলির জন্য রেজেেক্সটি হ'ল:

/[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}\\@[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}(\\.[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25})+/gi

PS: উপরের রেজেক্স দ্বারা সমর্থিত শীর্ষ স্তরের ডোমেনগুলি জুন ২০০ 2007 পর্যন্ত বর্তমান। একটি আপ টু ডেট তালিকার জন্য আপনাকে https://data.iana.org/TLD/tlds-alpha-by-domain.txt পরীক্ষা করতে হবে ।


3
যেহেতু আপনার ক্ষেত্রে কেস-সংবেদনশীল নিয়মিত অভিব্যক্তি রয়েছে তাই আপনাকে নির্দিষ্ট করতে হবে a-zA-Zএবং http|https|Http|Https|rtsp|Rtsp
রাই-

4
এটি দুর্দান্ত, তবে আমি কখনই এটি ব্যবহার করব তা নিশ্চিত নই। বেশিরভাগ ব্যবহারের ক্ষেত্রে টিএলডি-র হার্ড-কোডেড তালিকার উপর নির্ভর করে এমন পদ্ধতির ব্যবহারের চেয়ে আমি কিছু মিথ্যা ইতিবাচকতা গ্রহণ করব। আপনি যদি আপনার কোডে টিএলডি তালিকাবদ্ধ করেন, আপনি গ্যারান্টি দিচ্ছেন যে এটি একদিন অচল হয়ে যাবে, এবং আমি যদি এড়াতে পারি তবে আমি বরং আমার কোডে ভবিষ্যতের বাধ্যতামূলক রক্ষণাবেক্ষণ তৈরি করব না।
মার্ক আমেরিকা

3
এটি 101% সময় কাজ করে, দুর্ভাগ্যক্রমে এটি এমন urlও সন্ধান করে যা কোনও স্থানের আগে নয়। আমি যদি হ্যালো@mydomain.com এ কোনও ম্যাচ চালনা করি তবে এটি 'মাইডোমাইন.কম' ধরে। এটির উন্নতি করার কোনও উপায় কি কেবলমাত্র এটি ধরার আগে যদি এর আগে একটি জায়গা থাকে?
ডেমিনিটিক্স

এছাড়াও লক্ষণীয়, এটি ব্যবহারকারী প্রবেশ করা url ধরার জন্য উপযুক্ত
ডেমিনিটিক্স

নোট করুন যে গ্রেপকোড ডট কম এখন আর নেই, আমি এখানে অ্যান্ড্রয়েড উত্স কোডে সঠিক জায়গার একটি লিঙ্ক বলে মনে করি । আমি মনে করি অ্যান্ড্রয়েড যে রিজেক্স ব্যবহার করছে তা সম্ভবত ২০১৩ (মূল পোস্ট) থেকে আপডেট হতে পারে তবে 2015 এর পরে আপডেট হয়েছে বলে মনে হয় না এবং তাই কিছু নতুন টিএলডি হারিয়ে যেতে পারে।
জেমস

19

ক্রিসেন্ট তাজা উত্তরের উপর ভিত্তি করে

আপনি যদি http: // বা http: // ছাড়া এবং www দ্বারা লিঙ্কগুলি সনাক্ত করতে চান তবে আপনি নিম্নলিখিত ব্যবহার করতে পারেন

function urlify(text) {
    var urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g;
    //var urlRegex = /(https?:\/\/[^\s]+)/g;
    return text.replace(urlRegex, function(url,b,c) {
        var url2 = (c == 'www.') ?  'http://' +url : url;
        return '<a href="' +url2+ '" target="_blank">' + url + '</a>';
    }) 
}

এটি একটি ভাল সমাধান, তবে আমি এটিও পরীক্ষা করতে চাই যে পাঠ্যটিতে এর মধ্যে ইতিমধ্যে href না থাকা উচিত। আমি এই রেজেক্সটি চেষ্টা করেছিলাম = /((?!href)((https?:\/\/))(www\.))(mailto:)) ^\s ++)/gi কিন্তু এটি কাজ করছে না। আপনি কি আমাকে এটির সাহায্য করতে পারেন বা উপরের রেজেক্স কেন কাজ করছেন না।
শচীন জগতাপ

আমি পছন্দ করি যে আপনি ফিরে আসা আউটপুটে লক্ষ্য = "_ ফাঁকা" যোগ করেছেন। এই সংস্করণটি আমি যা চেয়েছিলাম তা হ'ল। উপরের দিক থেকে খুব বেশি কিছু নেই (অন্যথায় আমি লিংকাইফ ব্যবহার করব) বেশিরভাগ লিঙ্ক পাওয়ার জন্য যথেষ্ট।
মাইকেল কুবলার

18

এনপিএমের এই লাইব্রেরিটি দেখে মনে হচ্ছে এটি বেশ বিস্তৃত https://www.npmjs.com/package/linkifyjs

লিঙ্কাইফাই প্লেইন-পাঠ্যে ইউআরএলগুলি খুঁজতে এবং তাদের এইচটিএমএল লিঙ্কগুলিতে রূপান্তর করার জন্য একটি ছোট্ট তবে বিস্তৃত জাভাস্ক্রিপ্ট প্লাগইন। এটি সমস্ত বৈধ URL এবং ইমেল ঠিকানাগুলির সাথে কাজ করে।


4
আমি সবেমাত্র আমার প্রকল্পে লিঙ্কফিজেস বাস্তবায়ন করেছি এবং এটি দুর্দান্ত। লিঙ্কফিজেস এই প্রশ্নের উত্তর হওয়া উচিত। অন্যটি দেখতে হবে github.com/twitter/twitter-text
উবার শ্নুজ

6

চিত্রগুলিও রেন্ডার করার জন্য ফাংশনটি আরও উন্নত করা যেতে পারে:

function renderHTML(text) { 
    var rawText = strip(text)
    var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   

    return rawText.replace(urlRegex, function(url) {   

    if ( ( url.indexOf(".jpg") > 0 ) || ( url.indexOf(".png") > 0 ) || ( url.indexOf(".gif") > 0 ) ) {
            return '<img src="' + url + '">' + '<br/>'
        } else {
            return '<a href="' + url + '">' + url + '</a>' + '<br/>'
        }
    }) 
} 

বা থাম্বনেইল চিত্রের জন্য যা পূর্ণ আকারের চিত্রের সাথে লিঙ্ক করে:

return '<a href="' + url + '"><img style="width: 100px; border: 0px; -moz-border-radius: 5px; border-radius: 5px;" src="' + url + '">' + '</a>' + '<br/>'

এবং এখানে স্ট্রিপ () ফাংশনটি বিদ্যমান যে কোনও এইচটিএমএলকে সরিয়ে একত্রীকরণের জন্য পাঠ্য স্ট্রিংটিকে প্রাক-প্রসেস করে।

function strip(html) 
    {  
        var tmp = document.createElement("DIV"); 
        tmp.innerHTML = html; 
        var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
        return tmp.innerText.replace(urlRegex, function(url) {     
        return '\n' + url 
    })
} 

2
let str = 'https://example.com is a great site'
str.replace(/(https?:\/\/[^\s]+)/g,"<a href='$1' target='_blank' >$1</a>")

শর্ট কোড বড় কাজ! ...

ফলাফল:-

 <a href="https://example.com" target="_blank" > https://example.com </a>

1

বিদ্যমান এনপিএম প্যাকেজ রয়েছে: url-regex , কেবল এটির সাথে ইনস্টল করুন yarn add url-regexবা npm install url-regexনিম্নলিখিত হিসাবে ব্যবহার করুন:

const urlRegex = require('url-regex');

const replaced = 'Find me at http://www.example.com and also at http://stackoverflow.com or at google.com'
  .replace(urlRegex({strict: false}), function(url) {
     return '<a href="' + url + '">' + url + '</a>';
  });

0

tmp.innerText অপরিজ্ঞাত। আপনার tmp.innerHTML ব্যবহার করা উচিত

function strip(html) 
    {  
        var tmp = document.createElement("DIV"); 
        tmp.innerHTML = html; 
        var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
        return tmp.innerHTML .replace(urlRegex, function(url) {     
        return '\n' + url 
    })

0

এটা চেষ্টা কর:

function isUrl(s) {
    if (!isUrl.rx_url) {
        // taken from https://gist.github.com/dperini/729294
        isUrl.rx_url=/^(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i;
        // valid prefixes
        isUrl.prefixes=['http:\/\/', 'https:\/\/', 'ftp:\/\/', 'www.'];
        // taken from https://w3techs.com/technologies/overview/top_level_domain/all
        isUrl.domains=['com','ru','net','org','de','jp','uk','br','pl','in','it','fr','au','info','nl','ir','cn','es','cz','kr','ua','ca','eu','biz','za','gr','co','ro','se','tw','mx','vn','tr','ch','hu','at','be','dk','tv','me','ar','no','us','sk','xyz','fi','id','cl','by','nz','il','ie','pt','kz','io','my','lt','hk','cc','sg','edu','pk','su','bg','th','top','lv','hr','pe','club','rs','ae','az','si','ph','pro','ng','tk','ee','asia','mobi'];
    }

    if (!isUrl.rx_url.test(s)) return false;
    for (let i=0; i<isUrl.prefixes.length; i++) if (s.startsWith(isUrl.prefixes[i])) return true;
    for (let i=0; i<isUrl.domains.length; i++) if (s.endsWith('.'+isUrl.domains[i]) || s.includes('.'+isUrl.domains[i]+'\/') ||s.includes('.'+isUrl.domains[i]+'?')) return true;
    return false;
}

function isEmail(s) {
    if (!isEmail.rx_email) {
        // taken from http://stackoverflow.com/a/16016476/460084
        var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
        var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
        var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
        var sQuotedPair = '\\x5c[\\x00-\\x7f]';
        var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
        var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
        var sDomain_ref = sAtom;
        var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
        var sWord = '(' + sAtom + '|' + sQuotedString + ')';
        var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
        var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
        var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
        var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

        isEmail.rx_email = new RegExp(sValidEmail);
    }

    return isEmail.rx_email.test(s);
}

এছাড়াও URL গুলি চিনতে পারবে যেমন google.com, http://www.google.bla, http://google.bla, www.google.blaকিন্তুgoogle.bla


0

আপনি সাধারণ ইউআরএল নিদর্শনগুলি নিষ্কাশন করতে এর মতো একটি রেজেক্স ব্যবহার করতে পারেন।

(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})

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

https://www.npmjs.com/package/pattern-dreamer


এর উদ্দেশ্য কী (?:www\.|(?!www))? কেন wwwww.comঅবৈধ হতে হবে?
টোটো

তুমি ঠিক. প্রকৃতপক্ষে আমি এটিকে কেবল রেজিেক্স হিসাবে ব্যবহার করেছি। আমি উপরের লিঙ্কযুক্ত লাইব্রেরি ব্যবহার করার পরামর্শ দেব। ইউআরএল সনাক্তকরণে আমাদের অনেকগুলি ক্ষেত্রে বিবেচনা করা উচিত, তাই রেজেেক্স আরও জটিল হওয়া উচিত।
কঙ্গ অ্যান্ড্রু

0

জেনেরিক অবজেক্ট ওরিয়েন্টেড সলিউশন

আমার মতো লোকদের জন্য যে কৌণিকের মতো ফ্রেমওয়ার্কগুলি ব্যবহার করে যা সরাসরি ডিওএমকে ম্যানিপুলেট করতে দেয় না, আমি একটি ফাংশন তৈরি করেছি যা একটি স্ট্রিং গ্রহণ করে এবং এমন একটি উপাদান url/ plainTextবস্তুর অ্যারে দেয় যা আপনি চান এমন কোনও ইউআই উপস্থাপনা তৈরি করতে ব্যবহার করতে পারেন।

ইউআরএল পুনরায়

ইউআরএল ম্যাচিংয়ের জন্য আমি ব্যবহার করেছি (কিছুটা অভিযোজিত) h0mayunরেজেক্স:/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g

আমার ফাংশনটি যেমন ইউআরএল এর শেষে থেকে বিরামচিহ্নগুলিকেও ফেলে দেয় .এবং ,আমি বিশ্বাস করি যে কোনও লিখিত URL শেষ হওয়ার চেয়ে প্রায়শই প্রকৃত বিরামচিহ্ন হবে (তবে এটি হতে পারে! অন্যান্য উত্তরগুলি ভালভাবে ব্যাখ্যা করার সাথে সাথে এটি কঠোর বিজ্ঞান নয়) এর জন্য আমি প্রয়োগ করি মিলে যাওয়া ইউআরএলগুলিতে রেজিেক্স অনুসরণ করা হচ্ছে /^(.+?)([.,?!'"]*)$/

প্রকারের কোড

    export function urlMatcherInText(inputString: string): UrlMatcherResult[] {
        if (! inputString) return [];

        const results: UrlMatcherResult[] = [];

        function addText(text: string) {
            if (! text) return;

            const result = new UrlMatcherResult();
            result.type = 'text';
            result.value = text;
            results.push(result);
        }

        function addUrl(url: string) {
            if (! url) return;

            const result = new UrlMatcherResult();
            result.type = 'url';
            result.value = url;
            results.push(result);
        }

        const findUrlRegex = /(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g;
        const cleanUrlRegex = /^(.+?)([.,?!'"]*)$/;

        let match: RegExpExecArray;
        let indexOfStartOfString = 0;

        do {
            match = findUrlRegex.exec(inputString);

            if (match) {
                const text = inputString.substr(indexOfStartOfString, match.index - indexOfStartOfString);
                addText(text);

                var dirtyUrl = match[0];
                var urlDirtyMatch = cleanUrlRegex.exec(dirtyUrl);
                addUrl(urlDirtyMatch[1]);
                addText(urlDirtyMatch[2]);

                indexOfStartOfString = match.index + dirtyUrl.length;
            }
        }
        while (match);

        const remainingText = inputString.substr(indexOfStartOfString, inputString.length - indexOfStartOfString);
        addText(remainingText);

        return results;
    }

    export class UrlMatcherResult {
        public type: 'url' | 'text'
        public value: string
    }

0

আপনি যদি http: // অথবা http: // অথবা http: // বা Ftp ছাড়াই বা অন্য সম্ভাব্য কেসগুলি যেমন শেষের দিকে পেছনের বিরামচিহ্ন অপসারণের মতো সনাক্ত করতে চান তবে এই কোডটি একবার দেখুন।

https://jsfiddle.net/AndrewKang/xtfjn8g3/

এটি ব্যবহারের একটি সহজ উপায় হ'ল এনপিএম ব্যবহার করা

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