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

时间:2014-08-01 12:53:32

标签: 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);

结果是以下字符串:

http://www.cambridgeenglish.org/test-your-english/&sa=U&ei=a4rbU8agB-zY0QWS_IGYDw&ved=0CFEQFjAL&usg=AFQjCNGU4FMUPB2ZuVM45OoqQ39rJbfveg

现在我想只提取这个位 http://www.cambridgeenglish.org/test-your-english/ 。我基本上需要摆脱从 &amp 开始的所有事情。

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

2 个答案:

答案 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'],'&amp'));

答案 1 :(得分:2)

以下正则表达式将在字符串&amp之后删除所有内容。你的PHP代码将是,

<?php
echo preg_replace('~&amp.*$~', '', 'http://www.cambridgeenglish.org/test-your-english/&amp;sa=U&amp;ei=a4rbU8agB-zY0QWS_IGYDw&amp;ved=0CFEQFjAL&amp;usg=AFQjCNGU4FMUPB2ZuVM45OoqQ39rJbfveg');
?> //=> http://www.cambridgeenglish.org/test-your-english/

<强>解释

  • &amp匹配字符串&amp
  • .*匹配任何字符零次或多次。
  • $行尾。