用于获取标签的第一个和最后一个实例之间的所有内容的正则表达式

时间:2017-08-03 20:24:39

标签: regex regex-lookarounds regex-group

我在项目中使用了一些Blade语法,我需要手动解析foreach循环的内容。语法实际上看起来像:

@foreach
  @foreach
    Text
  @endforeach
@endforeach

我需要找到一个正则表达式字符串来抓取第一个@foreach/@endforeach

所包含的内容

我已尝试过"@foreach(.*?)@endforeach",但这会被第一个@endforeach抓住。

此正则表达式示例的预期输出为:

@foreach
   Text
@endforeach

4 个答案:

答案 0 :(得分:1)

这个正则表达式可以解决这个问题

(小于?= @的foreach)。*(?= @ endforeach)

我已经创建了一个指向我创建它的网站的链接,在那里你也可以生成代码,以便在不同语言(JavaScript,Java,PHP,Python和其他语言)中使用这个正则表达式

https://regex101.com/r/9finjx/1

答案 1 :(得分:0)

以下是我提出的(在JavaScript中)

let str = `@foreach
             @foreach
              Text
            @endforeach
          @endforeach`;
let result = str.match(/^\@foreach[\s\n]+([a-zA-Z0-9@\s\n]+)\@endforeach$/);
console.log(result[1]);//@foreach Text @endforeach

\@foreach[\s\n]+ =>遍历第一个@foreach   ([a-zA-Z0-9@\s\n]+) =>在它之后抓住一切   \@endforeach$ =>让一个@endforeach离开

答案 2 :(得分:0)

https://regex101.com/

http://www.rexegg.com/regex-lookarounds.html

正则表达式在第一个@endforeach停止的原因是因为?中的.*?使其成为 lazy 量词,这意味着正则表达式将使用少量字符尽可能。抛弃?会使它成为一个贪婪的量词,它将使用尽可能多的字符。

@foreach[\s\S]*@endforeach,让你的正则表达式贪婪,匹配整个字符串。

如果您想要介于两者之间的所有内容,您可能需要使用前瞻和后瞻。

(?<=@foreach)[\s\S]*(?=@endforeach)捕获所有内容,包括第一个@foreach之后的换行符。

但是,如果在第一个循环之外有更多@foreach个循环,这将会中断。 e.g。

@foreach
    Text
@endforeach
@foreach
    More text
@endforeach

答案 3 :(得分:-1)

是的,正则表达式搜索在找到第一个@endforeach时停止。要获得所需内容,请使用{1,}表示该模式中的一个或多个:

(@foreach)(.*?)(@endforeach){1,}

但在这种情况下,我建议您使用substr和strpos()以及strrpos而不是正则表达式:

<?php

$blade_str = "
Some Template content before loop

@foreach
  @foreach
    Some text in loop
  @endforeach
@endforeach

some content after loop";


$loop_str = substr($blade_str, strpos($blade_str , '@foreach'));
print("\nloop_str=" . $loop_str);

// grab start of text after first @foreach
$inner_str = substr($loop_str, 8); // @foreach is 8 chars

// strip out last @endforeach
$inner_str = substr($inner_str, 0, strrpos($inner_str, '@endforeach'));

print("\ninner_str=" . $inner_str);

http://phptester.net/上对此进行测试,您将获得以下结果:

loop_str=@foreach @foreach Some text in loop @endforeach @endforeach some content after loop 
inner_str= @foreach Some text in loop @endforeach
祝你好运!