我有以下正则表达式规则:
'/((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/'
它工作得很好,但我不希望它匹配任何前面有换行符和 4 个或更多空格的东西,这意味着这样的事情:
"\n "
怎么能做到这一点?
我在行首添加了一个负前瞻。它检查是否存在后跟 4 个或更多空白字符的换行符。如果此条件存在,则匹配将失败。
'/^(?!\n\s{4,}).*((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/'
您不需要在前瞻中包含换行符本身,只需^
在多行模式下使用起始锚 ( )。此外,由于\s
可以匹配包括换行符和制表符在内的所有类型的空格,所以最好使用文字空格字符:
'/^(?! {4}).*(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'
说到制表符,它们可以用来代替四个空格在 SO 上创建代码块,因此您可能也希望允许这样做:
'/^(?! {4}|\t).*(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'
最后,如果您希望正则表达式仅匹配(如在consume中)URL,您可以使用 match-start-reset 运算符\K
. 它就像一个积极的后视,没有固定长度的限制:
'/^(?! {4}|\t).*?\K(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'