获取链接php中的唯一值不起作用

时间:2012-07-21 22:10:51

标签: php regex arrays

我有一个文本字符串,然后我从php regex获取一个URL。可以有任意数量的链接,所以我正在使用

 preg_match_all

问题在于,由于某些原因,当我放入一个链接时,它认为有3.当我执行数组唯一时,它会过滤掉中间值,但不会过滤掉最后一个。

以下是代码

 $bodyMessage = imap_body($hMail,$idxMsg);
 $bodyMessage = quoted_printable_decode($bodyMessage);

 preg_match_all('((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)', $bodyMessage, $matches, PREG_PATTERN_ORDER);
 $links = array_unique($matches[0]);
 print_r($links); 

print_r($ links)的输出是:

 Array ( [0] => http://usnews.msnbc.msn.com/_news/2012/07/20/12861792-6-year-old-girl-confirmed-to-have-been-killed-in-colorado-theater-shootings?lite 
 [2] => http://usnews.msnbc.msn.com/_news/2012/07/20/12861792-6-year-old-girl-confirmed-to-have-been-killed-in-colorado-theater-shootings?lite

它解析的电子邮件正文是:

 --20cf300e4d7d02c34004c55e1489 Content-Type: text/plain; charset=ISO-8859-1 @bill http://usnews.msnbc.msn.com/_news/2012/07/20/12861792-6-year-old-girl-confirmed-to-have-been-killed-in-colorado-theater-shootings?lite --20cf300e4d7d02c34004c55e1489 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable @bill 

有什么想法吗? 谢谢!

编辑:

我按照建议,通过修剪,然后返回一个空数组

 function trims($l){
                    trim($l);   
                }
                $links = $matches[0];
                $trimmedLinks = array_map("trims", $links);
                $trimmedLinks = array_unique($trimmedLinks);
                print_r($trimmedLinks); // = Array ( [0] => ) 

编辑:

我认为这可能与从imap抓取身体信息有关。当我从imap复制并粘贴文本字符串,并将其设置为$ bodyMessage时,它可以工作...... 建议?

1 个答案:

答案 0 :(得分:2)

你应该有这样的模式

((?:https?|ftp|gopher|telnet|file|notes|ms-help):(?:(?://)|(?:\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)

与非捕获组。如果你把?:放在括号中,你就会得到非捕获组。然后一个数组将是:

Array ( [0] => http://usnews.msnbc.msn.com/_news/2012/07/20/12861792-6-year-old-girl-confirmed-to-have-been-killed-in-colorado-theater-shootings?lite )

编辑:这个问题的答案是使用imap_fetchbody而不是