在PHP中使用正则表达式删除多个斜杠有很多问题。但是,我有一个特殊情况,我想排除。
我有一个完整的网址作为我的输入:http://localhost/path/to/whatever
我已写入正则表达式将反斜杠转换为正斜杠,然后删除多个连续斜杠:
$cleaned = preg_replace('/(\\\+)|(\/+)/', "/", trim($input));
这大部分工作正常,但是我需要能够排除://
的情况,否则使用该表达式将导致不是预期的结果:
http:/localhost/path/to/whatever
我尝试过使用/(\\\+)|^[:](\/+)/
,但这似乎不起作用。
如何在表达式中排除://
个案?
答案 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));