在PHP中使用正则表达式本身内的正则表达式变量

时间:2013-11-26 15:13:55

标签: php regex

  

我的目标:我正在尝试使用正则表达式从PHP中file_get_contents()调用的混乱响应中检索名称字符串。

以下是我从file_get_contents电话中获取的内容的摘录,以及我将使用的字符串:

file_get_contents('http://releases.ubuntu.com/13.10/ubuntu-13.10-desktop-amd64.iso.torrent');
  

28:announce39://torrent.ubuntu.com:6969 / announce13:宣布-listll39://torrent.ubuntu.com:6969 / announceel44://ipv6.torrent.ubuntu.com:6969 / announceee7:comment29 :Ubuntu CD releases.ubuntu.com13:创建datei1382003607e4:infod6:lengthi925892608e4: name30:ubuntu-13.10-desktop-amd64.iso12 :piece lengthi524288e6:pieces35320:I½ÊŒÞJÕ`9

你可以看到我如何鼓励上面感兴趣的文字。我正在使用的正则表达式如下:

preg_match('/name[0-9]+\:(.*?)\:/i', $c, $matches);

这给了我:

name30:ubuntu-13.10-desktop-amd64.iso12

现在, name30 是下一个分号的名称和长度 30个字符,所以如何使用此变量继续在完成正则表达式之前只有30个字符长度,同时删除“名称”字符串并计算字符数?

我的最终目标是:

ubuntu-13.10-desktop-amd64.iso

注意:我确实考虑过删除任何结束号码而不是字符计数,但文件名可能没有有效的扩展名,并且可能会在将来以数字结尾。

2 个答案:

答案 0 :(得分:3)

假设name([0-9]+):对于找到所需内容的开头是可靠的,您可以使用preg_replace_callback

$names = array();
preg_replace_callback("/name([0-9]+):(.*?):/i", function($matches) use (&$names){
    // Substring of second group up to the length of the first group
    $names[] = substr($matches[2], 0, $matches[1]);
}, $c);

答案 1 :(得分:2)

另一种方式:

preg_match_all('/:name(\d+):\K[^:]+/', $str, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    $results[] = substr(match[0], 0, $match[1]);
}