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

时间:2019-04-11 17:36:35

标签: php regex html5 laravel visual-studio-code

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

{ if 1 == 1 }Middle Part{ /if }

然后,说我要替换的所有实例

{ if 1 == 1 }Middle Part{ /if }

使用

@if(1 == 1)Middle Part@endif

从概念上讲,我需要使用哪种工具(或正则表达式原理)替换要保留的文本周围的所有内容?

我想找到以{if ... }开头和以{/if}结尾的字符串,然后用{if ... }替换第一个值@if( ... )和第二个值{{1 }}和{/if},但我不想触摸“中间部分”文本。我还首先需要找到以@endif开头并以{if' and end with '}

替换的字符串

象征性地,如果我有ABC,我想拥有A部分,B部分和C部分的映射,但仅将A和C替换为其映射A-> X和C-> Z < / p>

我基本上是在尝试将模板文件从一种模板语言快速转换为另一种模板语言(在这种情况下,是将Smarty(.tpl)转换为Blade(.blade.php))。

自从我完成了除了简单的文本查找和替换之外的正则表达式以来,已有一段时间了。我知道我可以通过编程方式执行此操作,但是我想知道是否已经有工具可以处理这些模式。

谢谢。

1 个答案:

答案 0 :(得分: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

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