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

Php 从字符串中提取URL的特定部分,php,regex,html-content-extraction,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/t

我只需要用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
现在我只想提取这一点。我基本上需要从
&
开始摆脱一切


有人知道如何做到这一点吗?我需要运行另一个正则表达式还是可以将其添加到初始正则表达式中?

下面的正则表达式将删除字符串
&
之后的所有内容。你的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/
/=>http://www.cambridgeenglish.org/test-your-english/
说明:

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

    • 下面的正则表达式将删除字符串
      &
      之后的所有内容。你的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/
      
      /=>http://www.cambridgeenglish.org/test-your-english/
      
      说明:

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

      我建议您放弃regex,让PHP自己的parse_url函数为您完成以下任务:

      要获取到&;的路径的子字符串,请尝试:

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

      我建议您放弃正则表达式,让PHP自己的parse_url函数为您完成以下任务:

      要获取到&;的路径的子字符串,请尝试:

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

      我想我会采用下面Avinash Raj的解决方案。对我来说很好。谢谢你的评论!我想我会采用下面Avinash Raj的解决方案。对我来说很好。谢谢你的评论!这很有趣,但是路径仍然包含后面的部分,因此它不能真正解决我的初始问题。为您更新了答案,我认为这应该可以满足您的需要。这很有趣,但是路径仍然包含后面的部分,因此它不能真正解决我的初始问题。为您更新了答案,我认为这应该满足你的需要