Php 正则表达式清理url

Php 正则表达式清理url,php,regex,Php,Regex,我正在寻找一种从字符串中获取有效url的方法,如: $string = 'http://somesite.com/directory//sites/9/my_forms/3-895a3e/somefilename.jpg|:||:||:||:|19845'; 我最初的解决方案是: preg_match('#^[^:|]*#', str_replace('//', '/', $string), $modifiedPath); 但显然它将从http://而不是在字符串中间移除一个斜杠。 我希望从

我正在寻找一种从字符串中获取有效url的方法,如:

$string = 'http://somesite.com/directory//sites/9/my_forms/3-895a3e/somefilename.jpg|:||:||:||:|19845';
我最初的解决方案是:

preg_match('#^[^:|]*#', str_replace('//', '/', $string), $modifiedPath);
<>但显然它将从http://而不是在字符串中间移除一个斜杠。

我希望从原件中获得的预期输出是:

http://somesite.com/directory/sites/9/my_forms/3-895a3e/somefilename.jpg

我总是可以先断开字符串的http部分,但如果可能的话,我想要一个更优雅的正则表达式形式的解决方案。谢谢。

这将完全满足您的要求:

 <?php

$string = 'http://somesite.com/directory//sites/9/my_forms/3-895a3e/somefilename.jpg|:||:||:||:|19845';

preg_match('/^([^|]+)/', $string, $m); // get everything up to and NOT including the first pipe (|)
$string = $m[1];

$string = preg_replace('/(?<!:)\/\//', '/' ,$string); // replace all occurrences of // as long as they are not preceded by :

echo $string; // outputs: http://somesite.com/directory/sites/9/my_forms/3-895a3e/somefilename.jpg

exit;

 ?>
但是我们需要确保我们正在寻找的匹配之前没有:字符,所以我们需要“回头看”我们的匹配,看看:字符是否在那里。如果是,则我们不希望将其视为匹配:

(?<!:)\/\/
(?
在我们的lookback中,!表示不匹配。如果我们将其更改为
(?=:)\/\/
,那么它将只匹配前面有:的双斜杠


这里有一个快速教程,可以比我更好地解释这一切

这将完全满足您的要求:

 <?php

$string = 'http://somesite.com/directory//sites/9/my_forms/3-895a3e/somefilename.jpg|:||:||:||:|19845';

preg_match('/^([^|]+)/', $string, $m); // get everything up to and NOT including the first pipe (|)
$string = $m[1];

$string = preg_replace('/(?<!:)\/\//', '/' ,$string); // replace all occurrences of // as long as they are not preceded by :

echo $string; // outputs: http://somesite.com/directory/sites/9/my_forms/3-895a3e/somefilename.jpg

exit;

 ?>
但是我们需要确保我们正在寻找的匹配之前没有:字符,因此我们需要“回头看”匹配是否有:字符。如果是,则我们不希望将其视为匹配:

(?<!:)\/\/
(?
在我们的lookback中,!表示不匹配。如果我们将其更改为
(?=:)\/\/
,那么它将只匹配前面有:的双斜杠


这里有一个快速教程,可以比我更好地解释这一点

假设您的所有字符串都是给定的形式,您只需要最简单的正则表达式就可以做到这一点;如果您想要一个优雅的解决方案,那么正则表达式肯定不是您所需要的。此外,双斜杠在URL中是合法的,就像在Unix路径中一样,并且含义相同一个斜杠可以做的事情,所以你根本不需要去掉它们

为什么不

$url = array_shift(preg_split('/\|/', $string));
?

如果你真的,真的关心去掉URL中的双斜杠,那么你可以用

$url = preg_replace('/([^:])\/\//', '$1/', $url);
甚至将它们组合成

$url = preg_replace('/([^:])\/\//', '$1/', array_shift(preg_split('/\|/', $string)));

尽管最后一个表单有点麻烦。

假设您的所有字符串都是给定的表单,您只需要最简单的正则表达式就可以做到这一点;如果您想要一个优雅的解决方案,那么正则表达式肯定不是您所需要的。此外,双斜杠在URL中是合法的,就像在Unix路径中一样,单斜杠也意味着同样的事情是的,所以你根本不需要摆脱它们

为什么不

$url = array_shift(preg_split('/\|/', $string));
?

如果你真的,真的关心去掉URL中的双斜杠,那么你可以用

$url = preg_replace('/([^:])\/\//', '$1/', $url);
甚至将它们组合成

$url = preg_replace('/([^:])\/\//', '$1/', array_shift(preg_split('/\|/', $string)));

尽管最后一个表单有点毛茸茸的。

因为这是一个非常严格定义的情况,所以我只考虑一个PREG是最优雅的解决方案。

从我的头顶:

$sanitizedURL = preg_replace('~((?<!:)/(?=/)|\\|.+)~', '', $rawURL);

<代码> $SAIIZEDURL= PREGGRESH('~(?)< P>因为这是一个非常严格定义的情况,我只考虑一个PREG是最优雅的解决方案。

从我的头顶:

$sanitizedURL = preg_replace('~((?<!:)/(?=/)|\\|.+)~', '', $rawURL);


$sanitizedURL=preg_replace(“~”(?这可能是有帮助的:
parse_url()
首先是什么损坏了它们?@Bondye
parse_url()
只会将.com/后面的所有字符设置为“路径”。它不会清理双斜杠和填充。这可能是有帮助的:
parse_url()
parse_url()首先是什么把它们弄坏了?@Bondye
parse_url()
将只将.com/as“path”后面的所有字符设置为“path”。它不会清除双斜杠,并且填充无效。您的解决方案中仍然包含双斜杠URL@Drew是的,双斜杠是合法的,在URL中被忽略,那么你为什么关心它们呢?@Drew说,如果双斜杠是合法的,那么清理它们就很简单了出于美学的考虑,我刚刚更新了我的答案,加入了同样的方法。Aaron我不知道//实际上是有效的,所以谢谢你指出这一点。@Shawn当然!这有点晦涩;我做了十年的专业web开发人员,去年才知道。(当然,多余的斜杠可能会破坏天真的URI解析器,因此无论如何都最好避免,但如果您无法控制接收的内容,并且没有将结果传递给任何会破坏它们的内容,则可以安全地忽略它们。)它不起作用。您的解决方案中仍然包含双斜杠URL@Drew是的,双斜杠是合法的,在URL中被忽略了,那么你为什么关心它们呢?@Drew说,如果出于美观的原因,清理双斜杠对你来说很重要,那就没什么大不了的了,我刚刚更新了我的答案,加入了同样的方法。Aaron我没有意识到//实际上是有效的,所以谢谢你指出这一点。@Shawn当然!它有点晦涩;我作为一名专业的web开发人员已经十年了,我只是在去年才发现它的。(当然,多余的斜杠会破坏幼稚的URI解析器,因此无论如何都是最好避免的,但是如果你不能控制接收到的内容,并且不将结果传递给任何会破坏它们的东西,它们可能会被安全地忽略。)Drew。我真的很喜欢这个解决方案,并感谢你的评论。你能向我解释一下吗?@Shawn
(?是一个负的零宽度look-behind断言;它的目的是指示模式前面不能有
字符。也就是说,它们使正则表达式行为的心智模型复杂化,以至于最好尽可能避免使用它们。@AaronMiller,听起来很可怕!但实际上并不是这样rd理解。@Shawn,我编辑了我的答案来解释表达式中发生了什么。@Drew我没有说这很难理解;我说它在正则表达式中的存在使得弄清楚正则表达式做了什么要比其他正则表达式复杂得多,因此最好尽可能避免环顾四周的断言。Drew。我实际上是li请接受此解决方案,并感谢您的评论。您能向我解释一下是什么吗