我需要使用PHP仅提取URL的一部分,但我正在努力达到提取应该停止的设定点。我使用正则表达式从更长的字符串中提取整个URL,如下所示:
$regex = '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i';
preg_match_all($regex, $href, $matches);
结果是以下字符串:
http://www.cambridgeenglish.org/test-your-english/&sa=U&ei=a4rbU8agB-zY0QWS_IGYDw&ved=0CFEQFjAL&usg=AFQjCNGU4FMUPB2ZuVM45OoqQ39rJbfveg
现在我想只提取这个位 http://www.cambridgeenglish.org/test-your-english/ 。我基本上需要摆脱从 &
开始的所有事情。
任何人都知道如何实现这一目标?我是否需要运行另一个正则表达式,还是可以将其添加到初始正则表达式?
答案 0 :(得分: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'];
要获得路径的子串到& amp,请尝试:
$parsed = parse_url($url);
$my_url = $parsed['scheme'] . '://' . $parsed['hostname'] . substr($parsed['path'], 0, strpos($parsed['path'],'&'));
答案 1 :(得分:2)
以下正则表达式将在字符串&
之后删除所有内容。你的PHP代码将是,
<?php
echo preg_replace('~&.*$~', '', 'http://www.cambridgeenglish.org/test-your-english/&sa=U&ei=a4rbU8agB-zY0QWS_IGYDw&ved=0CFEQFjAL&usg=AFQjCNGU4FMUPB2ZuVM45OoqQ39rJbfveg');
?> //=> http://www.cambridgeenglish.org/test-your-english/
<强>解释强>
&
匹配字符串&
。.*
匹配任何字符零次或多次。$
行尾。