我有以下正则规则:
'/((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/'
它的效果很好,但我不希望它匹配任何前面有换行符和4个或更多空格的内容,这意味着类似这样的内容:
"\n "
怎么做呢?
答案 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'