1

我想在我的 RSS 提要中转换以../stuff/more.phpto开头的相对 URL 。http://www.example.com/stuff/more.php

我用这个 PHP 代码来做如下:

$content = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#", '$1http://www.example.com/$2$3', $content);

结果是错误的想法,它返回这样的URL

http://www.example.com/../stuff/more.php

请注意该../部分尚未删除,请帮助!

所以基本上..

这就是我所拥有的:../stuff/more.php

这就是我得到的(在运行上面的代码之后):http://www.example.com/../stuff/more.php

这就是我想要的:http://www.example.com/stuff/more.php

4

5 回答 5

1

添加 (\.|\.\.|\/)* 应该可以。

$content = preg_replace("#(<\s*a\s+[^>] href\s =\s*[\"'])(?!http)(../|../|/)*( [^\"'>]+)([\"'>]+)#", '$1http://www.example.com/$3$4', $content);

另外,请注意 $2$3 已更改为 $3$4

编辑:

减少到一种选择:

    $content = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)(\.\.\/)*([^\"'>]+)([\"'>]+)#", '$1http://www.example.com/$3$4', $content);
于 2015-03-21T15:01:58.333 回答
0

为什么不直接用域替换前 2 个点?

$result = str_replace('..', 'http://www.example.com', $contet, 1);
于 2015-03-21T14:09:31.697 回答
0

使用$_SERVER[HTTP_HOST] $_SERVER[REQUEST_URI]是 PHP 中的全局变量来获取绝对 url。

于 2015-03-21T14:12:11.933 回答
0

好吧,我将开始研究正则表达式。大部分看起来都不错(事实上,你在这里有一个足够好的正则表达式,否则我有点惊讶你会遇到麻烦!)但结尾有点奇怪——最好像这样:

#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"']>)#

(从技术上讲,最好捕获起始报价并确保它是匹配的结束报价,但您可能不会有任何问题。

要删除../我会完全不使用正则表达式:

foreach (array("<a href=\"http://../foo/bar\">", 
        "<a href=\"../foo/bar\">") as $content) {
    echo "A content=$content<br />\n";
    ########## copy from here down to...
    if (preg_match("#(<\s*a\s+[^>]*?href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"']>)#", $content, $m)) {
        echo "m=<pre>".print_r($m,true)."</pre><br />\n";
        if (substr($m[2], 0, 3) == '../')
            $m[2] = substr($m[2], 3);
        $content = $m[1].'http://www.example.com/'.$m[2].$m[3];
    }
    ######### copy from above down to HERE
    echo "B content=$content<br />\n";
}

(我包含了一个围绕您要查找的内容的迷你测试套件 - 您只需要为您的代码获取内部标记的行。)

于 2015-03-21T14:12:26.803 回答
0

感谢所有帮助我的人,我找到了解决方案。这是我使用的代码:

$content = preg_replace("#(<a href=\"\.\.\/)#", '<a href="http://www.example.com/', $content);

它搜索<a href="../并用它替换它http://www.example.com/不是通用的,但这对我有用。

于 2015-03-21T15:39:27.877 回答