PHP - 匹配和替换网址

时间:2014-07-17 20:10:46

标签: php url

如果我在用户输入的名为$url的变量中有多个这样的网址:

http://www.example.com/home
/home
?home=true
home/

所有这些都应该在www.example.com网站下,

如何将网址替换为正确的形式?

这样的事情:

http://www.example.com/home => http://www.example.com/home
/ihome                      => http://www.example.com/ihome
?home=true                  => http://www.example.com/ihome?home=true 
home/                       => http://www.example.com/ihome/home/ 

最后都是当前页面/ihome

2 个答案:

答案 0 :(得分:0)

我假设你的问题是relative URLs

假设您位于http://example.com/home位置,并且有一个指向about page的链接,该链接已与http://example.com/about硬链接。这可以通过相对链接<a href="about">About</a>在'home.php'(或托管/ home的任何地方)中访问。这遵循标准目录协议,并且不会有太大变化。我提供的链接中记录了大量这些示例以获取更多信息。

编辑:最初的问题太过模糊,我的回答是真实的问题。正确答案,如何更换,如下。

使用str_replace(),如下面的评论中所示。一个例子,关于如何转换“/ ihome”。假设我们位于http://example.com/about位置。

$body = ...; // assuming this is going through whole php document

$url = "http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
$tokens = explode('/', $url);   
array_pop($tokens); // remove "/about"
$url = implode("", $tokens);
str_replace("/ihome", $url . "/ihome", $body);

最后一行肯定有争议,但这应该有效。如果您要检查多个链接,则可能需要采用正则表达式方法(即任何定义为“/ sub”的链接或任何查询“?query”)。

答案 1 :(得分:0)

Theres可能是在每个循环中使用单个preg_replace函数执行此操作的方法,但是这样的事情应该可以解决问题。

<?php

foreach($urls as $key => $val)
    if(!preg_match('/^http\:\/\/www\.example\.com\//', $val))
        $url[$key] = 'http://www.example.com/'.ltrim($val, '/');