Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式-忽略字符串开头的4个或更多空格?_Php_Regex - Fatal编程技术网

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

PHP正则表达式-忽略字符串开头的4个或更多空格?,php,regex,Php,Regex,我有以下正则表达式规则: '/((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/' 它工作得很好,但我不希望它匹配任何前面有换行符和4个或更多空格的内容,这意味着类似这样的内容: "\n " 如何做到这一点?我在行的开头添加了一个负前瞻。它检查是否存在换行符后跟4个或更多空白字符。如果存在此情况,则匹配将失败 '/^(?!\n\s{4,}).*((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/' 您不需要在前瞻中包含换行符本身,只需

我有以下正则表达式规则:

'/((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'
说到制表符,它们可以用来代替四个空格来创建代码块,所以您可能也需要考虑到这一点:

'/^(?! {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'

是的,就像堆栈上的
code
部分一样,如果一行开头有4个或更多空格,它就会变成一个代码,并且不会被处理。否定断言
(?.*有关一些有用的工具或更好的教程,请参见和。@mario注意,如果PHP中的正则表达式支持可变长度lookbehinds,则带有
负lookbehind的断言在这里将是最好的。正则表达式将是
/(?其中
..
是现有的正则表达式。您尝试过吗?它似乎不起作用(匹配通过),但我可能做错了什么,尽管我会说我没有。@RichardRodriguez Yeah刚刚做了一个小测试,似乎我能够在将测线开始锚移到前方之外时使其工作(不确定为什么它在内部不工作)。看看修改后的答案。