我的目标:我正在尝试使用正则表达式从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
注意:我确实考虑过删除任何结束号码而不是字符计数,但文件名可能没有有效的扩展名,并且可能会在将来以数字结尾。
答案 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]);
}