2012-07-21 58 views
3

我想弄清楚从一串文本中获取URL数组的方式。 文本将有所格式如下:使用php获取所有网址中的字符串

一些随机的文字在这里

http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-iphones-bezel-a-massive-notification-light/?grcc=88888Z0ZwdgtZ0Z0Z0Z0Z0&grcc2=835637c33f965e6cdd34c87219233711~1342828462249~fca4fa8af1286d8a77f26033fdeed202~510f37324b14c50a5e9121f955fac3fa~1342747216490~0~0~0~0~0~0~0~0~7~3~

http://techcrunch.com/2012/07/20/last-day-to-purchase-extra-early-bird-tickets-for-disrupt-sf/

显然,这些链接可以是任何东西(并且可以有很多链接,那些只是我现在正在测试的那些。如果我使用像我的正则表达式这样的简单URL,那么可以很好地工作。

我使用:

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

当我做了print_r($matches);结果我得到的是:

Array ([0] => Array (
    [0] => http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-iphon= 
    [1] => http://techcrunch.com/2012/07/20/last-day-to-purchase-extra-early-bird-tick= 
    [2] => http://techcrunch.co= 
    [3] => http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-ip= 
    [4] => http://techcrunch.com/2012/07/20/last-day-to-purc= 
    [5] => http://tec= 
) 
... 

数组中的这些项目没有一个是从上面的链接完整的链接。

任何人都知道获得我需要的东西的好方法吗?我发现了一堆正则表达式的东西来获得PHP的链接,但没有一个可行。

谢谢!

编辑:

好的,所以我从电子邮件拉这些链接。该脚本解析电子邮件,抓取邮件正文,然后尝试从中获取链接。 调查电子邮件后,看起来好像是由于某种原因在网址中间添加了一个空格。这是我的PHP脚本看到的正文消息的输出。

--00248c711bb99ca36d04c54ba5c6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-iphon= es-bezel-a-massive-notification-light/?grcc=3D88888Z0ZwdgtZ0Z0Z0Z0Z0&grcc2= =3D835637c33f965e6cdd34c87219233711~1342828462249~fca4fa8af1286d8a77f26033f= deed202~510f37324b14c50a5e9121f955fac3fa~1342747216490~0~0~0~0~0~0~0~0~7~3~ http://techcrunch.com/2012/07/20/last-day-to-purchase-extra-early-bird-tick= ets-for-disrupt-sf/ --00248c711bb99ca36d04c54ba5c6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable 

有关如何使其不破坏URL的任何建议?

EDIT 2

按Laurnet的建议,我跑这个代码:

$bodyMessage = str_replace("= ", "",$bodyMessage); 

然而,当我附和了这一点,它似乎并不想取代 “=”

--00248c711bb99ca36d04c54ba5c6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-iphon= es-bezel-a-massive-notification-light/?grcc=3D88888Z0ZwdgtZ0Z0Z0Z0Z0&grcc2= =3D835637c33f965e6cdd34c87219233711~1342828462249~fca4fa8af1286d8a77f26033f= deed202~510f37324b14c50a5e9121f955fac3fa~1342747216490~0~0~0~0~0~0~0~0~7~3~ http://techcrunch.com/2012/07/20/last-day-to-purchase-extra-early-bird-tick= ets-for-disrupt-sf/ --00248c711bb99ca36d04c54ba5c6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable 
+0

看起来对我很好:http://ideone.com/ulJ4a。 – mellamokb 2012-07-21 00:39:42

+0

嗯有趣......我刚刚编辑了我的问题......链接来自电子邮件,然后我解析以获取正文消息......它似乎像电子邮件正在链接的中间位置!建议? – Bill 2012-07-21 00:46:33

+0

'='的那些实例看起来像某种分块编码,代码没有正确处理。 – mellamokb 2012-07-21 00:48:29

回答

7
/** 
    * 
    * @get URLs from string (string maybe a url) 
    * 
    * @param string $string 

    * @return array 
    * 
    */ 
    function getUrls($string) { 
     $regex = '/https?\:\/\/[^\" ]+/i'; 
     preg_match_all($regex, $string, $matches); 
     //return (array_reverse($matches[0])); 
     return ($matches[0]); 
} 
+1

你也应该添加新行到否定'$ regex ='/ https?\:\/\/[^ \“\ n] +/i';' – UnLoCo 2015-04-25 18:36:05

0

改为使用下面的正则表达式。

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

希望它有帮助。

相关问题