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

标签 php regex html 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( ... ) 和第二个值,{/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

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

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

关于php - 如何使用正则表达式替换字符串的外部内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55638281/

相关文章:

php - 如何从 PHP 中获取远程 JSON 或 XML API 数据并将返回对象分配为 PHP 变量?

JavaScript 正则表达式 : replace matched strings in between two strings

javascript - 使用 jquery 修改文本区域的撤消/重做行为

php - mysql 计数,其中行 = 0

php - Zend 框架 : How to retrieve the id of the last inserted row?

php - 我需要 PDO 连接成功的确认

javascript - HTML 元素上的静态与动态事件附件

java - 使用 Java WebFilter 删除主题标签

php - Mysql REGEXP 搜索产品名称

JavaScript:将主 div 标签高度设置为零,这使得所有子 div 的高度都为零