0

代码:

    $pattern = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
    $urls = array();
    preg_match($pattern, $comment, $urls);

    return $urls;

根据在线正则表达式测试人员的说法,这个正则表达式是正确的并且应该可以工作:

http://regexr.com?35nf9

我使用以下方法输出 $links 数组:

$linkItems = $model->getLinksInComment($model->comments);
//die(print_r($linkItems));
echo '<ul>';
foreach($linkItems as $link) {
    echo '<li><a href="'.$link.'">'.$link.'</a></li>';
}
echo '</ul>';

输出如下所示:

$model->comments 如下所示:

destined for surplus
RT#83015
RT#83617
http://google.com
https://google.com
non-link

生成的列表只是假设是链接,并且不应该有空行。我所做的是否有问题,因为正则表达式似乎是正确的。

4

2 回答 2

1

如果我理解正确,你应该preg_match_all在你的getLinksInComment函数中使用:

preg_match_all($pattern, $comment, $matches);

if (isset($matches[0])) {
    return $matches[0];
}
return array();    #in case there are no matches

preg_match_all获取字符串中的所有匹配项(即使字符串包含换行符)并将它们放入您作为第三个参数提供的数组中。但是,与您的正则表达式的捕获组匹配的任何内容(例如(http|https|ftp|ftps))也将被放入您的$matches数组中($matches[1]等等)。$matches[0]这就是为什么你想像你的最终匹配数组一样返回。

我刚刚运行了这个确切的代码:

$line = "destined for surplus\n
RT#83015\n
RT#83617\n
http://google.com\n
https://google.com\n
non-link";

$pattern = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
preg_match_all($pattern, $line, $matches);

var_dump($matches);

并为我的输出得到了这个:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(17) "http://google.com"
    [1]=>
    string(18) "https://google.com"
  }
  [1]=>
  array(2) {
    [0]=>
    string(4) "http"
    [1]=>
    string(5) "https"
  }
  [2]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
  }
}
于 2013-07-25T20:04:33.020 回答
0

您的评论由多行构成,其中一些包含您感兴趣的 URL,仅此而已。在这种情况下,您无需使用任何类似于正则表达式灾难的东西来尝试从完整的评论文本中挑选 URL;您可以改为按换行符拆分,并单独检查每一行以查看它是否包含 URL。因此,您可能会实现更可靠的getLinksInComment()方法:

function getLinksInComment($comment) {
    $links = array();
    foreach (preg_split('/\r?\n/', $comment) as $line) {
        if (!preg_match('/^http/', $line)) { continue; };
        array_push($links, $line);
    };
    return $links;
};

通过适当的调整以用作对象方法而不是裸函数,这应该可以完全解决您的问题并让您自由地度过一天。

于 2013-07-25T20:23:52.960 回答