2013-12-10 2 views
0
<Link to: http://www.someurl(.+)> maybe some text here(.*) <Link: www.someotherurl(.+)> maybe even more text(.*) 

전체가 한 줄에 있다는 것을 감안할 때 전체 URL과 텍스트를 모두 추출하거나 더 잘 추출하려면 어떻게해야합니까? 즉. 이 예제에서는 다음을 추출하고 싶습니다.RegEx를 사용하여 문자열에서 모든 링크 및 텍스트 캡처

http://www.someurl(.+). maybe some text here(.*). www.someotherurl(.+). maybe even more text(.*)

기본적으로 <Link.*:.*은 각 링크 캡처를 시작하고 >은 끝낼 것입니다. 첫 번째 캡처 이후의 모든 텍스트는 다음 링크 캡처가 0 번 이상 발생할 때까지 캡처됩니다.

preg_match_all('/<Link.*?:.*?(https|http|www)(.+?)>(.*?)/', $v1, $m4); 

하지만 닫는 > 후 텍스트를 캡처 할 수있는 방법이 필요합니다

이 나는 ​​노력했다. 문제는 첫 번째 링크 다음에 다른 링크가 있거나 없을 수 있다는 것입니다 (물론 링크도 시작할 수 없습니다!).

당신은이 패턴을 사용할 수 있습니다
+0

전체 URL의 패턴을 사용하여'preg_split'을 시도하는 것이 더 쉬울 수 있습니다 –

답변

2
$string = "<Link to: http://www.someurl(.+)> maybe some text here(.*) <Link: www.someotherurl(.+)> maybe even more text(.*)"; 
$string = preg_split('~<link(?: to)?:\s*([^>]+)>~i',$string,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); 
echo "<pre>"; 
print_r($string); 

출력 :

Array 
(
    [0] => http://www.someurl(.+) 
    [1] => maybe some text here(.*) 
    [2] => www.someotherurl(.+) 
    [3] => maybe even more text(.*) 
) 
0

:

preg_match_all('~<link\b[^:]*:\s*\K(?<link>[^\s>]++)[^>]*>\s*(?<text>[^<]++)~', 
       $txt, $matches, PREG_SET_ORDER); 

foreach($matches as $match) { 
    printf("<br/>link: %s\n<br/>text: %s", $match['link'], $match['text']); 
} 
관련 문제