PHP中的REGEXP用于捕获特定的域链接

时间:2015-04-28 13:39:15

标签: php regex

所以我正在使用regexp来捕获字符串中的所有链接,这意味着从http,https等协议开始,以www开头的单词。或以某些特定域名结尾的单词“.com”,“。hr”和“.net”。 但不知何故,我所做的这个正则表达式总是返回以协议开头的所有链接,但只返回以特定域结尾的最后一个链接。 我做错了什么:|?非常感谢!

$description='test.com test2.hr http://www.test3.hr https://test4.com test3.net';
$pattern = '/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]|(?:\b((?:[\w]+\.com$)|(?:[\w]+\.hr$)|(?:[\w]+\.net$)))/i';
preg_match_all($pattern, $description, $out);
var_dump($out[0]);

1 个答案:

答案 0 :(得分:1)

原始正则表达式存在一些问题。首先,您应该使用条件修饰符?来处理协议。我不确定你为什么要使用[A-Z0-9+&@#\/%=~_|$]的第二个块,或者之后为什么要使用|运算符;如果有具体原因,请告诉我。最后,$仅在正则表达式的最后使用它时作为字符串结尾;否则,你应该使用\Z,它匹配正则表达式中任何一点的字符串结尾,尽管我认为你不想在这里匹配字符串结尾。我已经按照我认为你希望它工作的方式改写了下面的正则表达式:

$description='test.com test2.hr http://www.test3.hr https://test4.com test3.net trash string don\'t match test4.net';
$pattern = '/(?:(?:https?|ftp|file):\/\/(?:www|ftp)\.)?[-A-Z0-9+&@#\/%=~_|$?!:,.]*(\.[A-Z]+)/i';
preg_match_all($pattern, $description, $out);
var_dump($out[0]);

返回:

array(6) {
  [0]=>
  string(8) "test.com"
  [1]=>
  string(8) "test2.hr"
  [2]=>
  string(19) "http://www.test3.hr"
  [3]=>
  string(17) "https://test4.com"
  [4]=>
  string(9) "test3.net"
  [5]=>
  string(9) "test4.net"
}