PHP: 将相对顶部 URL "../" 替换为绝对域 URL
PHP: replace relative top URL "../" with absolute domain URL
我想将我的 RSS 提要中以 ../stuff/more.php
开头的相对 URL 转换为 http://www.example.com/stuff/more.php
。
我使用此 PHP 代码执行以下操作:
$content = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#", 'http://www.example.com/', $content);
结果想错了,它returnsURL这样
http://www.example.com/../stuff/more.php
请注意 ../
部分尚未删除,请帮忙!
所以基本上..
这是我拥有的:../stuff/more.php
这是我得到的(在 运行 上面的代码之后):http://www.example.com/../stuff/more.php
这是我想要的:http://www.example.com/stuff/more.php
为什么不直接用域替换前 2 个点?
$result = str_replace('..', 'http://www.example.com', $contet, 1);
使用$_SERVER[HTTP_HOST] $_SERVER[REQUEST_URI]
是PHP中的全局变量得到绝对url.
好吧,我将开始研究正则表达式。大部分内容看起来不错(事实上,您在这里有一个足够好的正则表达式,我有点惊讶您在其他方面遇到了麻烦!)但结尾有点奇怪——最好像这样:
#(<\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";
}
(我围绕您正在寻找的内容提供了一个小型测试套件 - 您只需要在代码中使用标记的行。)
添加 (\.|\.\.|\/)* 应该有效。
$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)(\.\.\/)*([^\"'>]+)([\"'>]+)#", 'http://www.example.com/', $content);
感谢所有帮助我的人,我找到了解决方案。
这是我使用的代码:
$content = preg_replace("#(<a href=\"\.\.\/)#", '<a href="http://www.example.com/', $content);
它搜索 <a href="../
并将其替换为 http://www.example.com/
这不是通用的,但这对我有用。
我想将我的 RSS 提要中以 ../stuff/more.php
开头的相对 URL 转换为 http://www.example.com/stuff/more.php
。
我使用此 PHP 代码执行以下操作:
$content = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#", 'http://www.example.com/', $content);
结果想错了,它returnsURL这样
http://www.example.com/../stuff/more.php
请注意 ../
部分尚未删除,请帮忙!
所以基本上..
这是我拥有的:../stuff/more.php
这是我得到的(在 运行 上面的代码之后):http://www.example.com/../stuff/more.php
这是我想要的:http://www.example.com/stuff/more.php
为什么不直接用域替换前 2 个点?
$result = str_replace('..', 'http://www.example.com', $contet, 1);
使用$_SERVER[HTTP_HOST] $_SERVER[REQUEST_URI]
是PHP中的全局变量得到绝对url.
好吧,我将开始研究正则表达式。大部分内容看起来不错(事实上,您在这里有一个足够好的正则表达式,我有点惊讶您在其他方面遇到了麻烦!)但结尾有点奇怪——最好像这样:
#(<\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";
}
(我围绕您正在寻找的内容提供了一个小型测试套件 - 您只需要在代码中使用标记的行。)
添加 (\.|\.\.|\/)* 应该有效。
$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)(\.\.\/)*([^\"'>]+)([\"'>]+)#", 'http://www.example.com/', $content);
感谢所有帮助我的人,我找到了解决方案。 这是我使用的代码:
$content = preg_replace("#(<a href=\"\.\.\/)#", '<a href="http://www.example.com/', $content);
它搜索 <a href="../
并将其替换为 http://www.example.com/
这不是通用的,但这对我有用。