PHP正则表达式 - 在字符串的开头准确忽略4个或更多空格?

时间:2013-02-20 00:10:45

标签: php regex

我有以下正则规则:

'/((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/'

它的效果很好,但我不希望它匹配任何前面有换行符和4个或更多空格的内容,这意味着类似这样的内容:

"\n    "

怎么做呢?

2 个答案:

答案 0 :(得分:1)

我添加了一个负向前瞻,锚定在行的开头。它检查是否存在换行符后跟4个或更多空白字符。如果存在这种情况,则匹配将失败。

'/^(?!\n\s{4,}).*((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/'

答案 1 :(得分:1)

您不需要在前瞻中包含换行符本身,只需在多行模式下使用起始锚点(^)即可。此外,由于\s可以匹配包括换行符和制表符在内的所有类型的空格,因此最好使用文字空格字符:

'/^(?! {4}).*(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'

说到标签,可以用它们代替四个空格来在SO上创建代码块,所以你可能也想要这样做:

'/^(?! {4}|\t).*(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'

最后,如果您希望正则表达式匹配(如在使用中)只有URL,则可以使用match-start-reset运算符\K。它的作用就像一个积极的外观,没有固定长度的限制:

'/^(?! {4}|\t).*?\K(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'