ইউআরএল জন্য পিএইচপি বৈধতা / regex


125

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


1
এটি একটি খুব ভাল সম্পদ। প্রচুর বিভিন্ন নিদর্শন এবং পরীক্ষার একটি তালিকা দেয়: mathiasbynens.be/demo/url-regex
ওমার জে

উত্তর:


79

আমি এটি কয়েকটি প্রকল্পে ব্যবহার করেছি, আমি বিশ্বাস করি না যে আমি সমস্যাগুলি নিয়ে চলেছি তবে আমি নিশ্চিত যে এটি সম্পূর্ণ নয়:

$text = preg_replace(
  '#((https?|ftp)://(\S*?\.\S*?))([\s)\[\]{},;"\':<]|\.\s|$)#i',
  "'<a href=\"$1\" target=\"_blank\">$3</a>$4'",
  $text
);

শেষে বেশিরভাগ এলোমেলো আবর্জনা হ'ল http://domain.com.বাক্যটির মতো পরিস্থিতিগুলি মোকাবেলা করা (পিছনের সময়ের সাথে মিলে যাওয়া এড়াতে)। আমি নিশ্চিত এটি পরিষ্কার করা যেতে পারে তবে যেহেতু এটি কাজ করেছে। আমি কমবেশি কেবল এটিকে প্রকল্প থেকে প্রকল্পে অনুলিপি করেছি।


7
কিছু জিনিস যা আমার দিকে ঝাঁপিয়ে পড়ে: এমন বিকল্পের ব্যবহার যেখানে অক্ষর শ্রেণির জন্য ডাকা হয় (প্রতিটি বিকল্প হুবহু এক চরিত্রের সাথে মেলে); এবং প্রতিস্থাপনের জন্য বাইরের ডাবল-কোটগুলির দরকার পড়েনি (এগুলি কেবলমাত্র রেজেক্সের অর্থহীন / ই পরিবর্তনের কারণে প্রয়োজন হয়েছিল)।
অ্যালান মুর

1
@ জন স্কিপিওন: google.comকেবলমাত্র বৈধ আপেক্ষিক ইউআরএল পাথ তবে একটি বৈধ পরম URL নয়। এবং আমি মনে করি সেটাই সে খুঁজছিল।
গম্বো

এই ক্ষেত্রে কাজ করে না - এটা অবশ্য শেষে "অন্তর্ভুক্ত: 3 cantari Noi মধ্যে albumul <a href=" audio.resursecrestine.ro/cantece/index-autori/andrei-rosu/...>
বোকা লোক

1
@ সফটফর্মের মতো কিছু http://example.com/somedir/...হ'ল একটি যথাযথ বৈধ ইউআরএল, নামের ফাইলটির জন্য জিজ্ঞাসা ...- যা বৈধ ফাইলের নাম।
স্টিফেন পি

আমি আপনার প্যাটার্নটি ব্যবহার করে http://www.example
ইউআরএলকে

207

filter_var()স্ট্রিংটি ইউআরএল কিনা তা যাচাই করতে ফাংশনটি ব্যবহার করুন :

var_dump(filter_var('example.com', FILTER_VALIDATE_URL));

যখন প্রয়োজন হয় না তখন নিয়মিত ভাব প্রকাশ করা খারাপ অভ্যাস।

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


29
5.2.13 এ একটি ত্রুটি রয়েছে (এবং আমি মনে করি 5.3.2) যা এই পদ্ধতিটি ব্যবহার করে তাদের ড্যাশযুক্ত ইউআরএলকে বৈধকরণ থেকে বিরত রাখে।
ভামিন

14
filter_var প্রত্যাখ্যান করবে test-site.com , আমি ড্যাশ সাথে ডোমেইন নাম আছে, wheter তারা বৈধ বা হয় না। ইউআরএলকে বৈধতা দেওয়ার জন্য ফিল্টার_ভারই সেরা উপায় বলে আমি মনে করি না। এটি ইউআরএলটিকে অনুমতি দেবেhttp://www
সিজার

4
> এটি ' www ' এর মতো ইউআরএলকে অনুমতি দেবে ঠিক আছে যখন ' লোকালহোস্ট' -এর মতো ইউআরএল হয়
স্ট্যানিসালাভ

12
এই পদ্ধতির অন্যান্য সমস্যাটি হ'ল এটি ইউনিকোড-নিরাপদ নয়।
বেনজি XVI

3
FILTER_VALIDATE_URL এর অনেকগুলি সমস্যা রয়েছে যার সমাধানের প্রয়োজন। এছাড়াও, পতাকাগুলি বর্ণনাকারী ডক্সগুলি প্রকৃত উত্স কোডটি প্রতিফলিত করে না যেখানে কয়েকটি পতাকার উল্লেখ সম্পূর্ণভাবে মুছে ফেলা হয়েছে। এখানে আরও তথ্য: news.php.net/php.internals/99018
এস

29

পিএইচপি ম্যানুয়াল অনুসারে - কোনও URL টি যাচাই করার জন্য parse_url ব্যবহার করা উচিত নয়

দুর্ভাগ্যক্রমে, মনে হচ্ছে এটি এর থেকে filter_var('example.com', FILTER_VALIDATE_URL)আরও ভাল কিছু করে না।

উভয়ই parse_url()এবং filter_var()ত্রুটিযুক্ত URL গুলি যেমন পাস করবেhttp://...

অতএব এই ক্ষেত্রে - Regex হয় ভাল পদ্ধতি।


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

2
কেন নিজের লেখা লিখতে হবে না - এর উদাহরণের জন্য এই পৃষ্ঠাতে সমস্ত শট ডাউন ডাউন রেজিেক্সগুলি দেখুন।
কেজকাই

3
তুমি মোটামুটি পয়েন্ট টলচলক করে দাও। ইউআরএল এর মতো কোনও কিছুর জন্য রেজিজেসগুলি (অন্যান্য প্রতিক্রিয়া অনুসারে) সঠিকভাবে পাওয়া খুব কঠিন হতে পারে। Regex সবসময় উত্তর হয় না। বিপরীতভাবে রেজেক্সও সর্বদা ভুল উত্তর হয় না। গুরুত্বপূর্ণ বিষয়টি হ'ল কাজের জন্য সঠিক সরঞ্জাম (রেজেক্স বা অন্যথায়) বাছাই করা এবং বিশেষত "এন্টি" বা "প্রো" রেজেক্স না হওয়া। অন্ধকারে, ফিল্টার_ভার এর প্রান্ত-ক্ষেত্রেগুলির সীমাবদ্ধতার সাথে মিলিয়ে আপনার উত্তরটি আরও ভাল উত্তরের মতো দেখায় (বিশেষত যখন রেজেক্স উত্তরগুলি 100 টিরও বেশি অক্ষর বা তার থেকে শুরু করে - বলেন
রেজেক্সকে

12

কেবলমাত্র যদি আপনি জানতে চান যে url আসলেই আছে কিনা:

function url_exist($url){//se passar a URL existe
    $c=curl_init();
    curl_setopt($c,CURLOPT_URL,$url);
    curl_setopt($c,CURLOPT_HEADER,1);//get the header
    curl_setopt($c,CURLOPT_NOBODY,1);//and *only* get the header
    curl_setopt($c,CURLOPT_RETURNTRANSFER,1);//get the response as a string from curl_exec(), rather than echoing it
    curl_setopt($c,CURLOPT_FRESH_CONNECT,1);//don't use a cached version of the url
    if(!curl_exec($c)){
        //echo $url.' inexists';
        return false;
    }else{
        //echo $url.' exists';
        return true;
    }
    //$httpcode=curl_getinfo($c,CURLINFO_HTTP_CODE);
    //return ($httpcode<400);
}

1
$urlইউআরএলটি যাচাই করার আগে আমি বাস্তবের যাচাই করার আগে আমি কিছু প্রকারের বৈধতা যাচাই করব কারণ উপরের ক্রিয়াকলাপটি ব্যয়বহুল - সম্ভবত ফাইলের আকারের উপর নির্ভর করে 200 মিলিসেকেন্ডের বেশি। কিছু ক্ষেত্রে ইউআরএলটির বাস্তবে এখনও উপলব্ধ অবস্থানে কোনও সংস্থান থাকতে পারে না (যেমন কোনও চিত্রের ইউআরএল তৈরি করা যা এখনও আপলোড হতে পারে না)। অতিরিক্তভাবে আপনি কোনও ক্যাশেড সংস্করণ ব্যবহার করছেন না যাতে এটির মতো নয় file_exists()যে কোনও ফাইলে একটি স্ট্যাটাস ক্যাশে হবে এবং প্রায় তাত্ক্ষণিকভাবে ফিরে আসবে। আপনার প্রদত্ত সমাধানটি এখনও কার্যকর। শুধু ব্যবহার fopen($url, 'r')করবেন না কেন ?
ইজমির রামিরেজ

ধন্যবাদ, ঠিক আমি যা খুঁজছিলাম তবে এটি ব্যবহার করার চেষ্টা করে আমি ভুল করেছিলাম made ফাংশনটি "url_exist" নয় "url_exists" ওহো ;-)
পিজে ব্রুনেট

9
ব্যবহারকারী প্রবেশ করানো ইউআরএল সরাসরি অ্যাক্সেস সুরক্ষা ঝুঁকি আছে?
সিলিকনপি

404 টি পাওয়া গেলে আপনি একটি চেক যুক্ত করতে চান: <কোড> $ httpCode = curl_getinfo ($ সি, CURLINFO_HTTP_CODE); // প্রতিধ্বনি $ ইউআরএল। ''। $ httpCode C '<br>'; যদি ($ httpCode == 404) cho প্রতিধ্বনি $ url। 404 '; } </code>
ক্যামেলিয়ো

মোটেই নিরাপদ নয় .. কোনও ইনপুট URL সক্রিয়ভাবে অ্যাক্সেস করা হবে।
dmmd

11

অনুযায়ী জন Gruber (সাহসী ফায়ারবল):

Regex:

(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))

প্রিগ_ম্যাচ () ব্যবহার করে:

preg_match("/(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/", $url)

এখানে বর্ধিত রেজেক্স প্যাটার্ন (মন্তব্য সহ):

(?xi)
\b
(                       # Capture 1: entire matched URL
  (?:
    https?://               # http or https protocol
    |                       #   or
    www\d{0,3}[.]           # "www.", "www1.", "www2." … "www999."
    |                           #   or
    [a-z0-9.\-]+[.][a-z]{2,4}/  # looks like domain name followed by a slash
  )
  (?:                       # One or more:
    [^\s()<>]+                  # Run of non-space, non-()<>
    |                           #   or
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\)  # balanced parens, up to 2 levels
  )+
  (?:                       # End with:
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\)  # balanced parens, up to 2 levels
    |                               #   or
    [^\s`!()\[\]{};:'".,<>?«»“”‘’]        # not a space or one of these punct chars
  )
)

আরও তথ্যের জন্য দয়া করে দেখুন: http://deringfireball.net/2010/07/mproved_regex_for_matching_urls


9

আমি মনে করি না যে নিয়মিত এক্সপ্রেশন ব্যবহার করা এই ক্ষেত্রে করণীয় is সমস্ত সম্ভাবনার সাথে মিল পাওয়া অসম্ভব এবং এমনকি যদি আপনি এটি করেন তবে এখনও এমন একটি সম্ভাবনা রয়েছে যা ইউআরএল কেবল উপস্থিত নেই।

ইউআরএলটি আসলে উপস্থিত রয়েছে এবং পাঠযোগ্য কিনা তা পরীক্ষা করার এখানে একটি খুব সহজ উপায়:

if (preg_match("#^https?://.+#", $link) and @fopen($link,"r")) echo "OK";

(যদি না থাকে preg_matchতবে এটি আপনার সার্ভারে থাকা সমস্ত ফাইলের নামও বৈধ করবে)


7

আমি এটি ভাল সাফল্যের সাথে ব্যবহার করেছি - কোথা থেকে পেয়েছি তা মনে নেই

$pattern = "/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i";

^ (HTTP: // | HTTPS: //)?? (([একটি z0-9] ([-a-z0-9] * [একটি-z0-9])) {1,63} \ ।) + [আজ] {2,6} (এখনও খুব লোভী হতে পারে, এখনও নিশ্চিত নয়, তবে এটি প্রোটোকল এবং শীর্ষস্থানীয় www এর চেয়ে আরও নমনীয়)
অ্যান্ড্রুবাড়ের ২

7
    function validateURL($URL) {
      $pattern_1 = "/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i";
      $pattern_2 = "/^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i";       
      if(preg_match($pattern_1, $URL) || preg_match($pattern_2, $URL)){
        return true;
      } else{
        return false;
      }
    }

লিঙ্কের মতো কাজ করে না: 'www.w3schools.com/home/3/?a=l'
ব্যবহারকার 3396065

5

এবং আপনার উত্তর আছে =) এটি ভাঙ্গার চেষ্টা করুন, আপনি পারবেন না !!!

function link_validate_url($text) {
$LINK_DOMAINS = 'aero|arpa|asia|biz|com|cat|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|mobi|local';
  $LINK_ICHARS_DOMAIN = (string) html_entity_decode(implode("", array( // @TODO completing letters ...
    "&#x00E6;", // æ
    "&#x00C6;", // Æ
    "&#x00C0;", // À
    "&#x00E0;", // à
    "&#x00C1;", // Á
    "&#x00E1;", // á
    "&#x00C2;", // Â
    "&#x00E2;", // â
    "&#x00E5;", // å
    "&#x00C5;", // Å
    "&#x00E4;", // ä
    "&#x00C4;", // Ä
    "&#x00C7;", // Ç
    "&#x00E7;", // ç
    "&#x00D0;", // Ð
    "&#x00F0;", // ð
    "&#x00C8;", // È
    "&#x00E8;", // è
    "&#x00C9;", // É
    "&#x00E9;", // é
    "&#x00CA;", // Ê
    "&#x00EA;", // ê
    "&#x00CB;", // Ë
    "&#x00EB;", // ë
    "&#x00CE;", // Î
    "&#x00EE;", // î
    "&#x00CF;", // Ï
    "&#x00EF;", // ï
    "&#x00F8;", // ø
    "&#x00D8;", // Ø
    "&#x00F6;", // ö
    "&#x00D6;", // Ö
    "&#x00D4;", // Ô
    "&#x00F4;", // ô
    "&#x00D5;", // Õ
    "&#x00F5;", // õ
    "&#x0152;", // Œ
    "&#x0153;", // œ
    "&#x00FC;", // ü
    "&#x00DC;", // Ü
    "&#x00D9;", // Ù
    "&#x00F9;", // ù
    "&#x00DB;", // Û
    "&#x00FB;", // û
    "&#x0178;", // Ÿ
    "&#x00FF;", // ÿ 
    "&#x00D1;", // Ñ
    "&#x00F1;", // ñ
    "&#x00FE;", // þ
    "&#x00DE;", // Þ
    "&#x00FD;", // ý
    "&#x00DD;", // Ý
    "&#x00BF;", // ¿
  )), ENT_QUOTES, 'UTF-8');

  $LINK_ICHARS = $LINK_ICHARS_DOMAIN . (string) html_entity_decode(implode("", array(
    "&#x00DF;", // ß
  )), ENT_QUOTES, 'UTF-8');
  $allowed_protocols = array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'mailto', 'irc', 'ssh', 'sftp', 'webcal');

  // Starting a parenthesis group with (?: means that it is grouped, but is not captured
  $protocol = '((?:'. implode("|", $allowed_protocols) .'):\/\/)';
  $authentication = "(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=" . $LINK_ICHARS . "]|%[0-9a-f]{2})+(?::(?:[\w". $LINK_ICHARS ."\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})*)?)?@)";
  $domain = '(?:(?:[a-z0-9' . $LINK_ICHARS_DOMAIN . ']([a-z0-9'. $LINK_ICHARS_DOMAIN . '\-_\[\]])*)(\.(([a-z0-9' . $LINK_ICHARS_DOMAIN . '\-_\[\]])+\.)*('. $LINK_DOMAINS .'|[a-z]{2}))?)';
  $ipv4 = '(?:[0-9]{1,3}(\.[0-9]{1,3}){3})';
  $ipv6 = '(?:[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7})';
  $port = '(?::([0-9]{1,5}))';

  // Pattern specific to external links.
  $external_pattern = '/^'. $protocol .'?'. $authentication .'?('. $domain .'|'. $ipv4 .'|'. $ipv6 .' |localhost)'. $port .'?';

  // Pattern specific to internal links.
  $internal_pattern = "/^(?:[a-z0-9". $LINK_ICHARS ."_\-+\[\]]+)";
  $internal_pattern_file = "/^(?:[a-z0-9". $LINK_ICHARS ."_\-+\[\]\.]+)$/i";

  $directories = "(?:\/[a-z0-9". $LINK_ICHARS ."_\-\.~+%=&,$'#!():;*@\[\]]*)*";
  // Yes, four backslashes == a single backslash.
  $query = "(?:\/?\?([?a-z0-9". $LINK_ICHARS ."+_|\-\.~\/\\\\%=&,$'():;*@\[\]{} ]*))";
  $anchor = "(?:#[a-z0-9". $LINK_ICHARS ."_\-\.~+%=&,$'():;*@\[\]\/\?]*)";

  // The rest of the path for a standard URL.
  $end = $directories .'?'. $query .'?'. $anchor .'?'.'$/i';

  $message_id = '[^@].*@'. $domain;
  $newsgroup_name = '(?:[0-9a-z+-]*\.)*[0-9a-z+-]*';
  $news_pattern = '/^news:('. $newsgroup_name .'|'. $message_id .')$/i';

  $user = '[a-zA-Z0-9'. $LINK_ICHARS .'_\-\.\+\^!#\$%&*+\/\=\?\`\|\{\}~\'\[\]]+';
  $email_pattern = '/^mailto:'. $user .'@'.'(?:'. $domain .'|'. $ipv4 .'|'. $ipv6 .'|localhost)'. $query .'?$/';

  if (strpos($text, '<front>') === 0) {
    return false;
  }
  if (in_array('mailto', $allowed_protocols) && preg_match($email_pattern, $text)) {
    return false;
  }
  if (in_array('news', $allowed_protocols) && preg_match($news_pattern, $text)) {
    return false;
  }
  if (preg_match($internal_pattern . $end, $text)) {
    return false;
  }
  if (preg_match($external_pattern . $end, $text)) {
    return false;
  }
  if (preg_match($internal_pattern_file, $text)) {
    return false;
  }

  return true;
}


4

সম্পাদনা করুন: ঘটনাগুলি নির্দেশিত
হিসাবে এই কোডটি পিএইচপি 5.3.0 (২০০৯-০6-৩০) এর সাথে প্রকাশিত হয়েছে এবং সে অনুযায়ী ব্যবহার করা উচিত।


শুধু আমার দুটি সেন্ট কিন্তু আমি এই ফাংশনটি বিকাশ করেছি এবং সাফল্যের সাথে এটি কিছুক্ষণ ব্যবহার করছি। এটি ভাল নথিভুক্ত এবং পৃথক করা হয়েছে যাতে আপনি সহজেই এটিকে পরিবর্তন করতে পারেন।

// Checks if string is a URL
// @param string $url
// @return bool
function isURL($url = NULL) {
    if($url==NULL) return false;

    $protocol = '(http://|https://)';
    $allowed = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)';

    $regex = "^". $protocol . // must include the protocol
             '(' . $allowed . '{1,63}\.)+'. // 1 or several sub domains with a max of 63 chars
             '[a-z]' . '{2,6}'; // followed by a TLD
    if(eregi($regex, $url)==true) return true;
    else return false;
}

1
Eregi পিএইচপি 6.0.0 এ সরানো হবে। এবং "öäåø" সহ ডোমেনগুলি আপনার ফাংশনের সাথে বৈধ হবে না। আপনার সম্ভবত প্রথমে ইউআরএলকে পিউকোডে রূপান্তর করা উচিত?

@ ঘটনা সম্পূর্ণ একমত। আমি মার্চ মাসে এটি লিখেছিলাম এবং পিএইচপি 5.3 কেবল জুনের শেষের দিকে ইরেগি প্রেরিত হিসাবে প্রকাশিত হয়েছিল। ধন্যবাদ. সম্পাদনা এবং আপডেট করা হবে।
ফ্রাঙ্কি

আমি ভুল হলে আমাকে সংশোধন করুন, তবে কি আমরা এখনও ধরে নিতে পারি টিএলডিগুলির সর্বনিম্ন 2 টি অক্ষর এবং সর্বাধিক 6 টি অক্ষর থাকবে?
ইজমির রামিরেজ

2
@ ইজমিররামিরেজ (এই সমস্ত বছর পরে ...) আপনি যদি নিজের মন্তব্য লিখেছিলেন তখন কোনও সন্দেহ থাকলে অবশ্যই এই মুহুর্তে টিএলডি নেই যেমন ফটোগ্রাফি
নিক রাইস

@ নিকরাইস আপনি সঠিক ... 5 বছরের মধ্যে ওয়েব কত পরিবর্তন হয়। এখন আমি যতক্ষণ না কেউ টিএলডি .supercalifragilisticexpialidocious তোলে অপেক্ষা করতে না পারে
Yzmir রামিরেজ

4
function is_valid_url ($url="") {

        if ($url=="") {
            $url=$this->url;
        }

        $url = @parse_url($url);

        if ( ! $url) {


            return false;
        }

        $url = array_map('trim', $url);
        $url['port'] = (!isset($url['port'])) ? 80 : (int)$url['port'];
        $path = (isset($url['path'])) ? $url['path'] : '';

        if ($path == '') {
            $path = '/';
        }

        $path .= ( isset ( $url['query'] ) ) ? "?$url[query]" : '';



        if ( isset ( $url['host'] ) AND $url['host'] != gethostbyname ( $url['host'] ) ) {
            if ( PHP_VERSION >= 5 ) {
                $headers = get_headers("$url[scheme]://$url[host]:$url[port]$path");
            }
            else {
                $fp = fsockopen($url['host'], $url['port'], $errno, $errstr, 30);

                if ( ! $fp ) {
                    return false;
                }
                fputs($fp, "HEAD $path HTTP/1.1\r\nHost: $url[host]\r\n\r\n");
                $headers = fread ( $fp, 128 );
                fclose ( $fp );
            }
            $headers = ( is_array ( $headers ) ) ? implode ( "\n", $headers ) : $headers;
            return ( bool ) preg_match ( '#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers );
        }

        return false;
    }

হাই এই সমাধানটি ভাল, এবং আমি এটি উত্সাহিত করেছি, তবে এটি
https- র

আমি
এটিতে

2

এটি। নেট স্ট্যাকওভারফ্লো প্রশ্নে অনুপ্রাণিত হয়েছে এবং সেই প্রশ্ন থেকে এই রেফারেন্স করা নিবন্ধে এই ইউআরআই ভ্যালিডেটর রয়েছে (ইউআরআই মানে এটি ইউআরএল এবং ইউআরএন উভয়কেই বৈধতা দেয়)।

if( ! preg_match( "/^([a-z][a-z0-9+.-]*):(?:\\/\\/((?:(?=((?:[a-z0-9-._~!$&'()*+,;=:]|%[0-9A-F]{2})*))(\\3)@)?(?=(\\[[0-9A-F:.]{2,}\\]|(?:[a-z0-9-._~!$&'()*+,;=]|%[0-9A-F]{2})*))\\5(?::(?=(\\d*))\\6)?)(\\/(?=((?:[a-z0-9-._~!$&'()*+,;=:@\\/]|%[0-9A-F]{2})*))\\8)?|(\\/?(?!\\/)(?=((?:[a-z0-9-._~!$&'()*+,;=:@\\/]|%[0-9A-F]{2})*))\\10)?)(?:\\?(?=((?:[a-z0-9-._~!$&'()*+,;=:@\\/?]|%[0-9A-F]{2})*))\\11)?(?:#(?=((?:[a-z0-9-._~!$&'()*+,;=:@\\/?]|%[0-9A-F]{2})*))\\12)?$/i", $uri ) )
{
    throw new \RuntimeException( "URI has not a valid format." );
}

আমি এই ফাংশনটি সফলভাবে ইউনিট-টেস্ট করেছি যার Uriদ্বারা নামকরণ এবং পরীক্ষিত একটি ভ্যালুওবজেক্ট তৈরি করেছি UriTest

UriTest.php (উভয় ইউআরএল এবং ইউআরএন জন্য বৈধ এবং অবৈধ কেস রয়েছে)

<?php

declare( strict_types = 1 );

namespace XaviMontero\ThrasherPortage\Tests\Tour;

use XaviMontero\ThrasherPortage\Tour\Uri;

class UriTest extends \PHPUnit_Framework_TestCase
{
    private $sut;

    public function testCreationIsOfProperClassWhenUriIsValid()
    {
        $sut = new Uri( 'http://example.com' );
        $this->assertInstanceOf( 'XaviMontero\\ThrasherPortage\\Tour\\Uri', $sut );
    }

    /**
     * @dataProvider urlIsValidProvider
     * @dataProvider urnIsValidProvider
     */
    public function testGetUriAsStringWhenUriIsValid( string $uri )
    {
        $sut = new Uri( $uri );
        $actual = $sut->getUriAsString();

        $this->assertInternalType( 'string', $actual );
        $this->assertEquals( $uri, $actual );
    }

    public function urlIsValidProvider()
    {
        return
            [
                [ 'http://example-server' ],
                [ 'http://example.com' ],
                [ 'http://example.com/' ],
                [ 'http://subdomain.example.com/path/?parameter1=value1&parameter2=value2' ],
                [ 'random-protocol://example.com' ],
                [ 'http://example.com:80' ],
                [ 'http://example.com?no-path-separator' ],
                [ 'http://example.com/pa%20th/' ],
                [ 'ftp://example.org/resource.txt' ],
                [ 'file://../../../relative/path/needs/protocol/resource.txt' ],
                [ 'http://example.com/#one-fragment' ],
                [ 'http://example.edu:8080#one-fragment' ],
            ];
    }

    public function urnIsValidProvider()
    {
        return
            [
                [ 'urn:isbn:0-486-27557-4' ],
                [ 'urn:example:mammal:monotreme:echidna' ],
                [ 'urn:mpeg:mpeg7:schema:2001' ],
                [ 'urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66' ],
                [ 'rare-urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66' ],
                [ 'urn:FOO:a123,456' ]
            ];
    }

    /**
     * @dataProvider urlIsNotValidProvider
     * @dataProvider urnIsNotValidProvider
     */
    public function testCreationThrowsExceptionWhenUriIsNotValid( string $uri )
    {
        $this->expectException( 'RuntimeException' );
        $this->sut = new Uri( $uri );
    }

    public function urlIsNotValidProvider()
    {
        return
            [
                [ 'only-text' ],
                [ 'http//missing.colon.example.com/path/?parameter1=value1&parameter2=value2' ],
                [ 'missing.protocol.example.com/path/' ],
                [ 'http://example.com\\bad-separator' ],
                [ 'http://example.com|bad-separator' ],
                [ 'ht tp://example.com' ],
                [ 'http://exampl e.com' ],
                [ 'http://example.com/pa th/' ],
                [ '../../../relative/path/needs/protocol/resource.txt' ],
                [ 'http://example.com/#two-fragments#not-allowed' ],
                [ 'http://example.edu:portMustBeANumber#one-fragment' ],
            ];
    }

    public function urnIsNotValidProvider()
    {
        return
            [
                [ 'urn:mpeg:mpeg7:sch ema:2001' ],
                [ 'urn|mpeg:mpeg7:schema:2001' ],
                [ 'urn?mpeg:mpeg7:schema:2001' ],
                [ 'urn%mpeg:mpeg7:schema:2001' ],
                [ 'urn#mpeg:mpeg7:schema:2001' ],
            ];
    }
}

Uri.php (মান অবজেক্ট)

<?php

declare( strict_types = 1 );

namespace XaviMontero\ThrasherPortage\Tour;

class Uri
{
    /** @var string */
    private $uri;

    public function __construct( string $uri )
    {
        $this->assertUriIsCorrect( $uri );
        $this->uri = $uri;
    }

    public function getUriAsString()
    {
        return $this->uri;
    }

    private function assertUriIsCorrect( string $uri )
    {
        // /programming/30847/regex-to-validate-uris
        // http://snipplr.com/view/6889/regular-expressions-for-uri-validationparsing/

        if( ! preg_match( "/^([a-z][a-z0-9+.-]*):(?:\\/\\/((?:(?=((?:[a-z0-9-._~!$&'()*+,;=:]|%[0-9A-F]{2})*))(\\3)@)?(?=(\\[[0-9A-F:.]{2,}\\]|(?:[a-z0-9-._~!$&'()*+,;=]|%[0-9A-F]{2})*))\\5(?::(?=(\\d*))\\6)?)(\\/(?=((?:[a-z0-9-._~!$&'()*+,;=:@\\/]|%[0-9A-F]{2})*))\\8)?|(\\/?(?!\\/)(?=((?:[a-z0-9-._~!$&'()*+,;=:@\\/]|%[0-9A-F]{2})*))\\10)?)(?:\\?(?=((?:[a-z0-9-._~!$&'()*+,;=:@\\/?]|%[0-9A-F]{2})*))\\11)?(?:#(?=((?:[a-z0-9-._~!$&'()*+,;=:@\\/?]|%[0-9A-F]{2})*))\\12)?$/i", $uri ) )
        {
            throw new \RuntimeException( "URI has not a valid format." );
        }
    }
}

ইউনিট টেস্ট চালানো

46 টি পরীক্ষায় 65 টি জোর দেওয়া হয়েছে। সতর্কতা: বৈধ জন্য 2 জন এবং ডেটা সরবরাহকারী অবৈধ এক্সপ্রেশন জন্য। একটি ইউআরএল এবং অন্যটি ইউআরএন এর জন্য। আপনি যদি v5.6 * বা তার আগের পিএইচপিউনাইটের একটি সংস্করণ ব্যবহার করে থাকেন তবে আপনাকে দুটি ডেটা সরবরাহকারীকে একটিতে যুক্ত করতে হবে।

xavi@bromo:~/custom_www/hello-trip/mutant-migrant$ vendor/bin/phpunit
PHPUnit 5.7.3 by Sebastian Bergmann and contributors.

..............................................                    46 / 46 (100%)

Time: 82 ms, Memory: 4.00MB

OK (46 tests, 65 assertions)

কোড কভারেজ

এই নমুনা ইউআরআই পরীক্ষকটিতে কোড-কভারেজের 100% রয়েছে।


2
"/(http(s?):\/\/)([a-z0-9\-]+\.)+[a-z]{2,4}(\.[a-z]{2,4})*(\/[^ ]+)*/i"
  1. (http (গুলি?): //) এর অর্থ http: // বা https: //

  2. ([a-z0-9 -] +।) + => ২.০ [a-z0-9-] এর অর্থ কোনও অ্যাজ চরিত্র বা কোনও 0-9 বা (-) চিহ্ন

                 2.1 (+) means the character can be one or more ex: a1w, 
                     a9-,c559s, f)
    
                 2.2 \. is (.)sign
    
                 2.3. the (+) sign after ([a-z0-9\-]+\.) mean do 2.1,2.2,2.3 
                    at least 1 time 
                  ex: abc.defgh0.ig, aa.b.ced.f.gh. also in case www.yyy.com
    
                 3.[a-z]{2,4} mean a-z at least 2 character but not more than 
                              4 characters for check that there will not be 
                              the case 
                              ex: https://www.google.co.kr.asdsdagfsdfsf
    
                 4.(\.[a-z]{2,4})*(\/[^ ]+)* mean 
    
                   4.1 \.[a-z]{2,4} means like number 3 but start with 
                       (.)sign 
    
                   4.2 * means (\.[a-z]{2,4})can be use or not use never mind
    
                   4.3 \/ means \
                   4.4 [^ ] means any character except blank
                   4.5 (+) means do 4.3,4.4,4.5 at least 1 times
                   4.6 (*) after (\/[^ ]+) mean use 4.3 - 4.5 or not use 
                       no problem
    
                   use for case https://stackoverflow.com/posts/51441301/edit
    
                   5. when you use regex write in "/ /" so it come

    " /( http ( s?)? ) / আমি "

                   6. almost forgot: letter i on the back mean ignore case of 
                      Big letter or small letter ex: A same as a, SoRRy same 
                      as sorry.

দ্রষ্টব্য: খারাপ ইংরেজির জন্য দুঃখিত আমার দেশ এটি ভাল ব্যবহার করে না।


4
আপনি কি এই প্রশ্নটি কত পুরানো লক্ষ্য করেছেন? দয়া করে আপনার রেজেক্সটি ব্যাখ্যা করুন, যে ব্যবহারকারীরা ইতিমধ্যে জানেন না তাদের বিবরণ ছাড়াই এটি বুঝতে অসুবিধা হবে।
নিক 3500

1

ঠিক আছে, সুতরাং এটি কিছুটা আরও জটিল তবে সাধারণ রেজেেক্স, তবে এটি বিভিন্ন ধরণের ইউআরএলকে অনুমতি দেয়।

উদাহরণ:

যা যা বৈধ হিসাবে চিহ্নিত করা উচিত।

function is_valid_url($url) {
    // First check: is the url just a domain name? (allow a slash at the end)
    $_domain_regex = "|^[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,})/?$|";
    if (preg_match($_domain_regex, $url)) {
        return true;
    }

    // Second: Check if it's a url with a scheme and all
    $_regex = '#^([a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))$#';
    if (preg_match($_regex, $url, $matches)) {
        // pull out the domain name, and make sure that the domain is valid.
        $_parts = parse_url($url);
        if (!in_array($_parts['scheme'], array( 'http', 'https' )))
            return false;

        // Check the domain using the regex, stops domains like "-example.com" passing through
        if (!preg_match($_domain_regex, $_parts['host']))
            return false;

        // This domain looks pretty valid. Only way to check it now is to download it!
        return true;
    }

    return false;
}

মনে রাখবেন যে প্রোটোকলগুলি আপনি অনুমতি দিতে চান তার জন্য একটি ইন-অ্যারে চেক রয়েছে (বর্তমানে কেবলমাত্র এইচটিপি এবং https সেই তালিকায় রয়েছে)।

var_dump(is_valid_url('google.com'));         // true
var_dump(is_valid_url('google.com/'));        // true
var_dump(is_valid_url('http://google.com'));  // true
var_dump(is_valid_url('http://google.com/')); // true
var_dump(is_valid_url('https://google.com')); // true

নিক্ষেপ: ত্রুটি অনুগ্রহ: অপরিবর্তিত সূচক: স্কিমটি যদি প্রোটোকলটি নির্দিষ্ট না করা থাকে তবে আমি আগে সেট করা আছে কিনা তা পরীক্ষা করার পরামর্শ দিই।
ব্যবহারকারী 3396065

@ ব্যবহারকারী 3396065, আপনি দয়া করে একটি উদাহরণ ইনপুট সরবরাহ করতে পারেন যা এটি ছুড়ে দেয়?
টিম গ্রিনিভেল্ড

1

আমার পক্ষে কাজ করা সেরা ইউআরএল রেজেজ:

function valid_URL($url){
    return preg_match('%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu', $url);
}

উদাহরণ:

valid_URL('https://twitter.com'); // true
valid_URL('http://twitter.com');  // true
valid_URL('http://twitter.co');   // true
valid_URL('http://t.co');         // true
valid_URL('http://twitter.c');    // false
valid_URL('htt://twitter.com');   // false

valid_URL('http://example.com/?a=1&b=2&c=3'); // true
valid_URL('http://127.0.0.1');    // true
valid_URL('');                    // false
valid_URL(1);                     // false

সূত্র: http://urlregex.com/


0

পিটারের রেজেক্স অনেক কারণে আমার কাছে ঠিক দেখাচ্ছে না। এটি ডোমেন নামে সমস্ত ধরণের বিশেষ অক্ষরকে মঞ্জুরি দেয় এবং অনেকের জন্য পরীক্ষা করে না।

ফ্র্যাঙ্কির ফাংশনটি আমার কাছে ভাল লাগছে এবং আপনি যদি কোনও ফাংশন না চান তবে আপনি উপাদানগুলি থেকে একটি ভাল রেজেক্স তৈরি করতে পারেন:

^(http://|https://)(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+[a-z]{2,6}

অনির্ধারিত তবে আমি মনে করি এটি কাজ করা উচিত।

এছাড়াও, ওউনের উত্তর 100% এর মতো দেখায় না। আমি Regex ডোমেইনের অংশ নেন এবং Regex পরীক্ষক টুলে এটা পরীক্ষিত http://erik.eae.net/playground/regexp/regexp.html

আমি নিম্নলিখিত লাইনটি রেখেছি:

(\S*?\.\S*?)

"regexp" বিভাগ এবং নিম্নলিখিত লাইনে:

-hello.com

"নমুনা পাঠ্য" বিভাগের অধীনে।

ফলাফলটি বিয়োগ চরিত্রের মধ্য দিয়ে যেতে পেরেছিল। কারণ \ এস এর অর্থ কোনও স্থান ছাড়ানো অক্ষর।

দ্রষ্টব্য ফ্র্যাঙ্কির থেকে রেজেক্সটি বিয়োগটি পরিচালনা করে কারণ এটি প্রথম চরিত্রের জন্য এই অংশটি রয়েছে:

[a-z0-9]

যা বিয়োগ বা অন্য কোনও বিশেষ চরিত্রকে অনুমতি দেবে না।


0

এখানে আমি এটি করেছি is তবে আমি মেন্টাইন করতে চাই যে আমি রেইজেক্স সম্পর্কে এতটা শিউর নই। তবে এটি আপনার কাজ করা উচিত :)

$pattern = "#((http|https)://(\S*?\.\S*?))(\s|\;|\)|\]|\[|\{|\}|,|”|\"|'|:|\<|$|\.\s)#i";
        $text = preg_replace_callback($pattern,function($m){
                return "<a href=\"$m[1]\" target=\"_blank\">$m[1]</a>$m[4]";
            },
            $text);

এইভাবে আপনার প্যাটার্নে আপনাকে খ্রিষ্ট চিহ্নিতকারী লাগবে না।

আশা করি এটা সাহায্য করবে :)


0

এখানে RegEx ব্যবহার করে ইউআরএল বৈধকরণের জন্য একটি সাধারণ ক্লাস এবং তারপরে জনপ্রিয় আরবিএল (রিয়েলটাইম ব্ল্যাকহোল তালিকা) সার্ভারের বিরুদ্ধে ডোমেনটি ক্রস-রেফারেন্স করে:

ইনস্টল করুন:

require 'URLValidation.php';

ব্যবহার:

require 'URLValidation.php';
$urlVal = new UrlValidation(); //Create Object Instance

domain()পদ্ধতির পরামিতি হিসাবে একটি URL যুক্ত করুন এবং রিটার্নটি পরীক্ষা করুন।

$urlArray = ['http://www.bokranzr.com/test.php?test=foo&test=dfdf', 'https://en-gb.facebook.com', 'https://www.google.com'];
foreach ($urlArray as $k=>$v) {

    echo var_dump($urlVal->domain($v)) . ' URL: ' . $v . '<br>';

}

আউটপুট:

bool(false) URL: http://www.bokranzr.com/test.php?test=foo&test=dfdf
bool(true) URL: https://en-gb.facebook.com
bool(true) URL: https://www.google.com

আপনি উপরে দেখতে পারেন, www.bokranzr.com একটি আরবিএলের মাধ্যমে দূষিত ওয়েবসাইট হিসাবে তালিকাভুক্ত হয়েছে যাতে ডোমেনটি মিথ্যা হিসাবে ফিরে আসে।


0

ওয়ার্ডপ্রেসের সাথে বিকাশকারী যে কেউ, কেবল ব্যবহার করুন

esc_url_raw($url) === $url

একটি ইউআরএল যাচাই করতে ( এখানে ওয়ার্ডপ্রেস 'ডকুমেন্টেশন অনesc_url_raw )। এটা তোলে URL গুলি অনেক বেশী ভালো পরিচালনা filter_var($url, FILTER_VALIDATE_URL)করা হয়েছে কারণ এটি হয় ইউনিকোড এবং পদ্ধতি এটা XSS-নিরাপদ। ( এখানে সমস্ত সমস্যার উল্লেখ করে একটি ভাল নিবন্ধ দেওয়া হয়েছেfilter_var )।


-1

আমি এটি একটি ইউআরএল মেলে সবচেয়ে দরকারী হিসাবে খুঁজে পেয়েছি ..

^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$

1
যে URL গুলির সাথে আরম্ভ হবে তা কি মিলবে ftp:?
andrewsi

/^(https?:\/\/)?( \/-/২০১৮ ?- ++)\.( \/\/২০১\ * \ /? $ /
শাহবাজ

-1

এর জন্য একটি পিএইচপি নেটিভ ফাংশন রয়েছে:

$url = 'http://www.yoururl.co.uk/sub1/sub2/?param=1&param2/';

if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
    // Wrong
}
else {
    // Valid
}

ফিল্টার ডেটা, বা ফিল্টার ব্যর্থ হলে FALSE প্রদান করে।

এটি এখানে দেখুন


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