从字符串中提取URL的特定部分

Cha*_*lls 1 php regex html-content-extraction

我需要使用PHP仅提取URL的一部分,但我正在努力达到提取应该停止的设定点.我使用正则表达式从更长的字符串中提取整个URL,如下所示:

$regex = '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i';
preg_match_all($regex, $href, $matches);
Run Code Online (Sandbox Code Playgroud)

结果是以下字符串:

http://www.cambridgeenglish.org/test-your-english/&sa=U&ei=a4rbU8agB-zY0QWS_IGYDw&ved=0CFEQFjAL&usg=AFQjCNGU4FMUPB2ZuVM45OoqQ39rJbfveg
Run Code Online (Sandbox Code Playgroud)

现在我想只提取这一点http://www.cambridgeenglish.org/test-your-english/.我基本上需要摆脱从头&amp开始的一切.

任何人都知道如何实现这一目标?我是否需要运行另一个正则表达式,还是可以将其添加到初始正则表达式?

edm*_*rce 5

我建议你放弃正则表达式,让PHP自己的parse_url函数为你做这个:

http://php.net/manual/en/function.parse-url.php

$parsed = parse_url($url);
$my_url = $parsed['scheme'] . '://' . $parsed['hostname'] . $parsed['path'];
Run Code Online (Sandbox Code Playgroud)

获取路径的子串到&,尝试:

$parsed = parse_url($url);
$my_url = $parsed['scheme'] . '://' . $parsed['hostname'] . substr($parsed['path'], 0, strpos($parsed['path'],'&amp'));
Run Code Online (Sandbox Code Playgroud)