Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从URL中删除backpath/parentpath?_Php_Regex - Fatal编程技术网

Php 如何从URL中删除backpath/parentpath?

Php 如何从URL中删除backpath/parentpath?,php,regex,Php,Regex,输入: 期望输出: http://foo/bar/baz/../../qux/ 这可以通过使用正则表达式实现(除非有人能提出更有效的替代方案) 如果这是一个前瞻性的展望,那么它将非常简单: http://foo/qux/ 虽然我不熟悉如何向后查找第一个“/”(即不执行/[a-z0-9-\]+\/\./) 我想到的解决方案之一是使用strev,然后应用前向查找正则表达式(第一个示例),然后执行strev。虽然我相信有一种更有效的方法。这不是我见过的最清楚的问题,但如果我理解你的问题,我想你只需

输入:

期望输出:

http://foo/bar/baz/../../qux/
这可以通过使用正则表达式实现(除非有人能提出更有效的替代方案)

如果这是一个前瞻性的展望,那么它将非常简单:

http://foo/qux/
虽然我不熟悉如何向后查找第一个“/”(即不执行
/[a-z0-9-\]+\/\./


我想到的解决方案之一是使用
strev
,然后应用前向查找正则表达式(第一个示例),然后执行
strev
。虽然我相信有一种更有效的方法。

这不是我见过的最清楚的问题,但如果我理解你的问题,我想你只需要改变你的想法:

/\.\.\/[^\/]+/
…然后用
/

这样做,直到没有替代品,你应该有你想要的

编辑

您的尝试似乎试图匹配一个正斜杠
/
和两个点
\.
,后跟一个斜杠
/
(或
\/
-它们应该匹配相同的内容),然后是一个或多个非斜杠字符
[^/]+
,以斜杠
/
结尾。翻动它,你想找到一个斜杠,后跟一个或多个非斜杠字符和一个终止斜杠,然后是两个点和最后一个斜杠

您可能会困惑地认为正则表达式引擎会在运行时解析和使用某些内容(因此您不希望使用后跟点数不正确的目录名),但这不是它通常的工作方式-正则表达式引擎在替换或返回任何内容之前匹配整个表达式。因此,您可以在目录名后面加两个点,或者在目录名后面加两个点——这对引擎没有影响

如果您尝试使用斜杠括起来的Perl风格语法,那么您当然需要对您试图匹配的任何斜杠(例如中间的斜杠)使用
\/
,但我也建议匹配并替换url中的括起来的斜杠:我认为PHP类似

/[^\/]+/\.\./

(??)

从技术上讲,您希望用“/”替换“/path1/path2/./../”的段,需要做的是匹配“pathx/”^n“../”^n,这绝对不是正则表达式(无上下文的Lenguaje)。。。但是大多数正则表达式库都支持一些非常规的lenguajes,并且可以(花费大量精力)管理这些lenguajes

解决这个问题的一个简单方法是,将“/[^./]+/../”替换为“/”,并在正则表达式中循环多次

如果您仍然需要在一个步骤中完成它,则需要进行前瞻和分组,但编写它会很困难(我不太习惯,但我会尝试)

编辑:

我只在1个正则表达式中找到了解决方案。。。但是应该使用PCRE正则表达式

preg_replace('/\/[^\/]+\/\.\.\//', '/', $input)
我的解决方案基于以下链接:

(请注意,在第一节中点是“禁止的”,如果您想让点变得更复杂,则不能使用path.1/path.2/,因为您应该承认点,但禁止在第一节中使用“../”

此子表达式用于接受路径名,如“path1/”等

([^/.]+/(?1)?\.\./)
此子表达式用于接受双点

[^/.]+/
您可以在中测试regexp (请记住将其设置为PCRE模式)

这是一份工作副本:
您应该能够使用以下代码:

\.\./
输出:

$url = 'http://foo/bar/baz/../../qux/';
$url_parts = parse_url( $url );
$path = $url_parts['path'];
while(strstr($path, '..'))
   $path = preg_replace('~[^/]*/\.{2}/~', '', $path);
$url_parts['path'] = $path;
$canoicalUrl = http_build_url(null, $url_parts);

echo $canoicalUrl;

请注意/[^\/]+/匹配/./@Qsebas,这是真的-如果可以假设输入格式正确,这不是问题,而是真的。。。
http://foo/qux/