2012-07-21 9 views
3

텍스트 문자열에서 URL 배열을 가져 오는 방법을 찾으려고합니다. 여기PHP로 문자열에있는 모든 URL 가져 오기

어떤 임의의 텍스트까지 분명히

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

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~, 그 링크가 무엇이든 될 수있다 (많은 사람들이있을 수 있습니다 : 텍스트가 어느 정도 같은 포맷됩니다 링크, 그 사람들이 내가 지금 테스트 중이 야. 내 정규식과 같은 간단한 URL을 사용하면 괜찮습니다.

내가 사용하고 : 나는 print_r($matches);을 수행 할 때

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

내가 얻는 결과는 다음과 같습니다 그 배열의 해당 항목의

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에 대한 링크를 얻기 위해 여러 정규식을 찾았지만 그 중 아무 것도 작동하지 않습니다.

감사합니다.

편집 :

좋아, 그래서 전자 메일에서 이러한 링크를 당기는거야. 스크립트는 전자 메일을 구문 분석하고 메시지 본문을 채취 한 다음 해당 링크를 가져 오려고 시도합니다. 이메일을 조사한 후 URL 중간에 공백이 추가 된 것처럼 보입니다. 다음은 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을 손상시키지 않는 방법에 대한 제안 사항이 있으십니까?

$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 
: EDIT 2

는 Laurnet의 제안에 따라, 나는이 코드를 실행

+0

잘 보입니다 : http://ideone.com/ulJ4a. – mellamokb

+0

흠 ... 흥미 롭습니다 ... 방금 내 질문을 편집했습니다 ... 링크가 전자 메일에서 나옵니다. 그러면 본문 메시지를 가져와 파싱합니다 ... 이메일 중간에 링크가있는 것처럼 보입니다! 제안? – Bill

+0

'= '의 그러한 인스턴스들은 당신의 코드가 적절히 다루어지지 않는 어떤 종류의 청크 인코딩과 같이 의심스럽게 보입니다. – mellamokb

답변

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

0

대신 다음 정규식을 사용하십시오.

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

희망이 있습니다.