【问题标题】:Extract specific part of URL from string从字符串中提取 URL 的特定部分
【发布时间】:2014-08-01 12:53:32
【问题描述】:

我只需要使用 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 开始的所有内容。

有人知道如何实现这一目标吗?我需要运行另一个正则表达式,还是可以将其添加到最初的正则表达式中?

【问题讨论】:

  • 我想我会使用下面的 Avinash Raj 的解决方案。对我来说效果很好。感谢您的评论!

标签: php regex html-content-extraction


【解决方案1】:

我建议你放弃正则表达式,让 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'));

【讨论】:

  • 这很有趣,但路径仍将包含 &amp 之后的部分,因此它并不能真正解决我最初的问题。
  • 为你更新了答案,我认为这应该满足你的需要
【解决方案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 匹配字符串&amp;amp
  • .* 匹配任意字符零次或多次。
  • $ 行尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2021-09-20
    • 2017-11-15
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多