如何使用正则表达式替换字符串的外部内容?

问题描述 投票:2回答:1

假设我有代码(或字符串):

{ 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' and end with '}开头并用@if(' and with ')替换的字符串

象征性地,如果我有ABC,我想要有A部分,B部分和C部分的映射,但只将A和C替换为它们的映射,A-> X和C-> Z

我基本上试图快速将模板文件从一种模板语言转换为另一种模板语言(在本例中,Smarty(.tpl)转换为Blade(.blade.php))。

由于我已经完成了简单文本查找和替换之外的正则表达式,所以有点了。我知道我可以以编程方式执行此操作,但我想知道是否有一个工具可以处理这些模式。

先感谢您。

php regex html5 laravel visual-studio-code
1个回答
0
投票

您可以使用此正则表达式匹配像示例字符串这样的最小结构,并使用(.*?)将两个变量部分捕获到两个组中,

{\s*if\s*(.*?)\s*}(.*?){\s*\/if\s*}

然后将其替换为以下内容,这将保留您的可变部件并将所有内容放入新结构中,如您所愿,

@if($1)$2@endif

Demo

PHP Code demo

$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

另外,如果你的结构没有嵌套,你应该只使用它。如果是嵌套的,你可能最好不要编写自己的自定义解析器,因为在这种情况下正则表达式是不够的。

© www.soinside.com 2019 - 2024. All rights reserved.