使用RegEx捕获所有链接&在一个字符串之间的文本

时间:2013-12-10 20:53:57

标签: php regex

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

鉴于这一切都在一行,我如何匹配或更好地提取所有完整的网址和文字?即。对于这个例子,我希望提取:

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

基本上,<Link.*:.*会启动每个链接捕获,>会结束它。然后,第一次捕获后的所有文本也将被捕获,直到下一次链接捕获出现零次或多次。

我试过了:

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

但我需要一种方法来在结束>之后捕获文本。问题是在第一个链接之后可能存在或可能没有其他链接(当然也可能没有链接开始!)。

2 个答案:

答案 0 :(得分: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(.*)
)

答案 1 :(得分: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']);
}