在正则表达式中替换异常中的多个斜杠

时间:2012-01-16 11:42:16

标签: php regex

在PHP中使用正则表达式删除多个斜杠有很多问题。但是,我有一个特殊情况,我想排除。

我有一个完整的网址作为我的输入:http://localhost/path/to/whatever

我已写入正则表达式将反斜杠转换为正斜杠,然后删除多个连续斜杠:

$cleaned = preg_replace('/(\\\+)|(\/+)/', "/", trim($input));

这大部分工作正常,但是我需要能够排除://的情况,否则使用该表达式将导致不是预期的结果:

http:/localhost/path/to/whatever

我尝试过使用/(\\\+)|^[:](\/+)/,但这似乎不起作用。

如何在表达式中排除://个案?

3 个答案:

答案 0 :(得分:3)

$cleaned = preg_replace('~(?<!https:|http:)[/\\\\]+~', "/", trim($input));

lookbehind内的子表达式不能使用量词,因此显而易见的方法 - (?<!https?:) - 将无效。但它可以由两个或多个具有不同长度的固定长度替代品组成。例如:

(?<!https:|http:)     # OK

请注意,轮换必须位于lookbehind的顶级,所以这不起作用:

(?<!(https:|http:))   # error

答案 1 :(得分:0)

有一种叫做“负面看法”的东西(也可以是正面或向前看)

http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html

有了这个,您可以添加类似

之类的异常
(?<=^https?:)

然后你的表达式只会在不以“http:”

开头的地方匹配

答案 2 :(得分:0)

只是一个冒号的负面后视,在两个或多个向前或向后斜线之前:

$cleaned = preg_replace('/(?<!:)(?:\\/|\\\\){2,}/', "/", trim($input));