0

我正在使用PHP 7.4.1.

我正在尝试解析来自谷歌的 RSS 提要。

我的链接如下所示:

https://www.google.com/url?rct=j&sa=t&url=https://www.timeslive.co.za/sunday-times/news/2020-11-01-hawks-following-former-steinhoff-ceo-markus-joostes-money/&ct=ga&cd=CAIyGjRm
https://www.google.com/url?rct=j&sa=t&url=https://www.politifact.com/factchecks/2020/oct/31/raphael-warnock/fact-checking-raphael-warnocks-claim-georgia-sen-k/&ct=ga&cd=CAIyGm
https://www.google.com/url?rct=j&sa=t&url=https://www.benzinga.com/news/20/10/18156683/last-weeks-notable-insider-buys-ibm-intel-raytheon-and-more&ct=ga&cd=CAIyGmM3Yjk5YjRlYWU
https://www.google.com/url?rct=j&sa=t&url=https://stocksregister.com/2020/10/31/insider-trading-at-avino-silver-gold-mines-ltd-nyseasm-what-did-we-note/&ct=ga&cd=CAIyGmM3Yjk5Y
https://www.google.com/url?rct=j&sa=t&url=https://www.businessinsider.co.za/who-received-an-sms-from-markus-jooste-2020-10&ct=ga&cd=CAIyGmM3Yjk5YjRlYWU3MWY2MDY6Y29tOmVuOlVT&am
https://www.google.com/url?rct=j&sa=t&url=https://stocksregister.com/2020/10/31/insider-trading-at-veritone-inc-nasdaqveri-what-did-we-note/&ct=ga&cd=CAIyGmM3Yjk5YjRlYWU3MWY2M
https://www.google.com/url?rct=j&sa=t&url=https://heavy.com/sports/las-vegas-raiders/jj-watt-stephon-gilmore-trade-targets/&ct=ga&cd=CAIyGmM3Yjk5YjRlYWU3MWY2MDY6Y29tOmVuOlVT&a
https://www.google.com/url?rct=j&sa=t&url=https://stocksregister.com/2020/10/31/insider-trading-at-truecar-inc-nasdaqtrue-what-did-we-note/&ct=ga&cd=CAIyGmM3Yjk5YjRlYWU3MWY2MD
https://www.google.com/url?rct=j&sa=t&url=https://stocksregister.com/2020/10/31/insider-trading-at-veeco-instruments-inc-nasdaqveco-what-did-we-note/&ct=ga&cd=CAIyGmM3Yjk5YjRl
https://www.google.com/url?rct=j&sa=t&url=https://stocksregister.com/2020/10/31/insider-trading-at-21vianet-group-inc-nasdaqvnet-what-did-we-note/&ct=ga&cd=CAIyGmM3Yjk5YjRlYWU

我想从中获得真正的链接url=并剪掉结尾/&ct=ga&cd=CAIyGjRm

然而,我试过str_replace了,因为它不同,所以很难解析出结尾。

任何建议如何获取链接?

4

2 回答 2

2

当没有合法/原生/可靠的技术来解析文本时,正则表达式是合适的。

PHP 提供本地函数来解析 url 和查询字符串。

以下代码段涉及多个本机函数,并且执行速度将比正则表达式慢,但当您的外部数据源重新配置其查询字符串数据时,它也不太可能中断。例如,如果他们添加了一个额外的参数rawurl=,那么正则表达式很容易错误地匹配这些。使用合法解析技术或正则表达式(在 url、有效 html、bbcode 等上)之间的争论太常见了——但开发人员的主要目标应该始终是数据完整性。如果您正在处理大量数据并且实际速度提升,则只考虑牺牲数据完整性以换取执行速度为您的系统/最终用户提供有价值的好处。如果您发现自己在没有充分理由的情况下倾向于微优化解决方案,我会建议您不要喝那种 kool-aid。

这是解析 url 并url提取值的一种方式。

代码:(演示

$url = 'https://www.google.com/url?rct=j&sa=t&url=https://www.timeslive.co.za/sunday-times/news/2020-11-01-hawks-following-former-steinhoff-ceo-markus-joostes-money/&ct=ga&cd=CAIyGjRm';

parse_str(
    htmlspecialchars_decode(
        parse_url(
            $url,
            PHP_URL_QUERY
        )
    ),
    $parts
);
echo $parts['url'];

输出:

https://www.timeslive.co.za/sunday-times/news/2020-11-01-hawks-following-former-steinhoff-ceo-markus-joostes-money/

我超级喜欢正则表达式,但不是每一项任务。在此处避免使用正则表达式将使您的脚本更易读、更可靠且更易于维护。

于 2020-11-01T07:02:34.190 回答
1

您可以在以下位置使用此正则表达式preg_match_all

(?<=url=)https?:\S+?(?=&amp;|$)

正则表达式演示

正则表达式详细信息:

  • (?<=url=):如果我们url=在当前位置之前
  • https?:\S+?http:: 匹配以or开头的 URLhttps:
  • (?=&amp;|$):如果我们&amp;在当前位置之后有或行结束

代码:

php > $s = "https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://www.timeslive.co.za/sunday-times/news/2020-11-01-hawks-following-former-steinhoff-ceo-markus-joostes-money/&amp;ct=ga&amp;cd=CAIyGjRm";
php > preg_match_all('~(?<=url=)https?:\S+?(?=&amp;|$)~', $s, $m);
php > print_r($m[0]);
Array
(
    [0] => https://www.timeslive.co.za/sunday-times/news/2020-11-01-hawks-following-former-steinhoff-ceo-markus-joostes-money/
)
于 2020-11-01T06:41:22.520 回答