我在项目中使用了一些Blade语法,我需要手动解析foreach循环的内容。语法实际上看起来像:
@foreach
@foreach
Text
@endforeach
@endforeach
我需要找到一个正则表达式字符串来抓取第一个@foreach/@endforeach
我已尝试过"@foreach(.*?)@endforeach"
,但这会被第一个@endforeach
抓住。
此正则表达式示例的预期输出为:
@foreach
Text
@endforeach
答案 0 :(得分:1)
这个正则表达式可以解决这个问题
(小于?= @的foreach)。*(?= @ endforeach)
我已经创建了一个指向我创建它的网站的链接,在那里你也可以生成代码,以便在不同语言(JavaScript,Java,PHP,Python和其他语言)中使用这个正则表达式
答案 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)
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
祝你好运!