假设我有代码(或字符串):
{ if 1 == 1 }Middle Part{ /if }
然后,假设我要替换所有实例
{ if 1 == 1 }Middle Part{ /if }
与
@if(1 == 1)Middle Part@endif
从概念上讲,我需要应用哪种工具(或正则表达式原理)来替换我想要保留的文本周围的所有内容?
我想找到以{if ... }
开头并以{/if}
结尾的字符串,然后替换第一个值{if ...
与 @if( ... )
和第二个值,{/if}
与 @endif
,但我不想触及“中间部分”文本。我还首先需要找到以 {if' 开头并以 '}
结尾并替换为 @if(' 和 ')
象征性地,如果我有 ABC,我想要 A 部分、B 部分和 C 部分的映射,但只将 A 和 C 替换为它们的映射,A->X 和 C->Z
我基本上是在尝试将模板文件从一种模板语言快速转换为另一种模板语言(在本例中,Smarty (.tpl) 转换为 Blade (.blade.php))。
我已经有一段时间没做过简单的文本查找和替换之外的正则表达式了。我知道我可以通过编程方式执行此操作,但我想知道是否已经有一种工具可以处理这些模式。
提前谢谢你。
最佳答案
您可以使用此正则表达式来匹配最小结构,例如您的示例字符串,并使用 (.*?)
将两个可变部分捕获到两个组中,
{\s*if\s*(.*?)\s*}(.*?){\s*\/if\s*}
然后将其替换为以下内容,这将保留您的可变部分并将所有内容放入您想要的新结构中,
@if($1)$2@endif
$s = '{ if 1 == 1 }Middle Part{ /if }';
echo preg_replace('/{\s*if\s*(.*?)\s*}(.*?){\s*\/if\s*}/', '@if($1)$2@endif', $s);
打印,
@if(1 == 1)Middle Part@endif
另一方面,您应该仅使用它,以防您的结构没有嵌套。在嵌套的情况下,您最好不要编写自己的自定义解析器,因为在这种情况下正则表达式是不够的。
关于php - 如何使用正则表达式替换字符串的外部内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55638281/