首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在symfony/goutte中加入URL

在symfony/goutte中加入URL
EN

Stack Overflow用户
提问于 2016-11-27 14:55:50
回答 2查看 1.2K关注 0票数 2

我有一个Goutte/Client (goutte对请求使用symfony ),我想加入路径并获得一个最终的URL:

代码语言:javascript
复制
$client = new Goutte\Client();
$crawler = $client->request('GET', 'http://DOMAIN/some/path/')
// $crawler is instance of Symfony\Component\DomCrawler\Crawler

$new_path = '../new_page';
$final path = $crawler->someMagicFunction($new_path);
// final path == http://DOMAIN/some/new_page

我要寻找的是一种简单的方法,从请求中加入$new_path变量和当前页面,并获得新的URL。

请注意,$new_page可以是以下任何一种:

代码语言:javascript
复制
new_page    ==> http://DOMAIN/some/path/new_page
../new_page ==> http://DOMAIN/some/new_page
/new_page   ==> http://DOMAIN/new_page

symfony/goutte/ gives提供了任何简单的方法吗?

我从Symfony\Component\HttpFoundation\Request找到了Symfony\Component\HttpFoundation\RequestSymfony\Component\BrowserKit\Request,但是我没有看到任何简单的方法将Symfony\Component\BrowserKit\Request转换成HttpFoundation\Request

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-27 15:48:19

您可以使用parse_url获取url的路径:

代码语言:javascript
复制
$components = parse_url('http://DOMAIN/some/path/');
$path = $components['path'];

那你就需要一种方法来赞美它。这个答案可以帮助您:

代码语言:javascript
复制
function normalizePath($path, $separator = '\\/')
{
    // Remove any kind of funky unicode whitespace
    $normalized = preg_replace('#\p{C}+|^\./#u', '', $path);

    // Path remove self referring paths ("/./").
    $normalized = preg_replace('#/\.(?=/)|^\./|\./$#', '', $normalized);

    // Regex for resolving relative paths
    $regex = '#\/*[^/\.]+/\.\.#Uu';

    while (preg_match($regex, $normalized)) {
        $normalized = preg_replace($regex, '', $normalized);
    }

    if (preg_match('#/\.{2}|\.{2}/#', $normalized)) {
        throw new LogicException('Path is outside of the defined root, path: [' . $path . '], resolved: [' . $normalized . ']');
    }

    return trim($normalized, $separator);
}

剩下要做的就是重新构建url,您可以看到这句话

代码语言:javascript
复制
function unparse_url($parsed_url) { 
    $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : ''; 
    $host     = isset($parsed_url['host']) ? $parsed_url['host'] : ''; 
    $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : ''; 
    $user     = isset($parsed_url['user']) ? $parsed_url['user'] : ''; 
    $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : ''; 
    $pass     = ($user || $pass) ? "$pass@" : ''; 
    $path     = isset($parsed_url['path']) ? $parsed_url['path'] : ''; 
    $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : ''; 
    $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : ''; 
    return "$scheme$user$pass$host$port/$path$query$fragment"; 
}

最后一条路:

代码语言:javascript
复制
$new_path = '../new_page';

if (strpos($new_path, '/') === 0) { // absolute path, replace it entirely
    $path = $new_path;
} else { // relative path, append it
    $path = $path . $new_path;
}

把它们放在一起:

代码语言:javascript
复制
// http://DOMAIN/some/new_page
echo unparse_url(array_replace($components, array('path' => normalizePath($path))));
票数 1
EN

Stack Overflow用户

发布于 2016-11-28 09:58:55

使用Uri::resolve()guzzlehttp/prs7包。此方法允许您从基础和相关部分创建规范化 URL。

一个示例(使用优秀的心理壳):

代码语言:javascript
复制
Psy Shell v0.7.2 (PHP 7.0.12 — cli) by Justin Hileman
>>> $base = new GuzzleHttp\Psr7\Uri('http://example.com/some/dir')
=> GuzzleHttp\Psr7\Uri {#208}
>>> (string) GuzzleHttp\Psr7\Uri::resolve($base, '/new_base/next/next/../../back_2')
=> "http://example.com/new_base/back_2"

还请看一下UriNormalizer类。有一个与您的问题相关的示例(测试用例)。

从测试用例中:

代码语言:javascript
复制
$uri = new Uri('http://example.org/../a/b/../c/./d.html');
$normalizedUri = UriNormalizer::normalize($uri, UriNormalizer::REMOVE_DOT_SEGMENTS);

$this->assertSame('http://example.org/a/c/d.html', (string) $normalizedUri);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40830285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档