创建基于变量字符串的if / else变量和preg匹配/替换

时间:2018-09-25 13:25:53

标签: php regex preg-replace preg-match

我有一个文本区域,我们的用户可以用实际订单数据替换变量。

例如{{service_name}}将替换为“ DJ Booth”

现在,我正在创建基于服务名称显示某些文本的功能。例如...

Some text at the start

{{if|service_name=DJ Booth}}
  This is the text for DJs
{{endif}}

Some text in the middle

{{if|service_name=Dancefloor Hire}}
  This is the text for dancefloor hire
{{endif}}

Some text at the end

使用U(非贪婪)和s(多行)解决了使preg_match在多行中工作的问题

所以现在的输出是...。

enter image description here

问题是可能有多个条件,所以我不能只预匹配类型然后打印值,因为我需要遍历每个匹配,并在匹配的地方替换文本,而不是在底部输出

所以我正在使用这个...

$service = get_service();
preg_match_all("/{{if\|service=(.*)}}(.*){{endif}}/sU", $text, $matches);
$i=0;
foreach($matches[1] as $match) {
  if ($match == $service) {
    print $match[2][$i];
  }
}

哪个匹配正确,但只是将所有文本一起输出,而不是在它们匹配的同一位置输出。

所以我的问题是......

  • 我如何让替换发生在原地?

谢谢!

1 个答案:

答案 0 :(得分:1)

通过在正则表达式模式中使用搜索变量,可以定位所需的占位符。您不需要匹配/捕获搜索字符串,只需匹配其后的文本即可。匹配整个占位符,并将其替换为条件语法中包含的捕获组。

  • 我正在使用\R来匹配换行符。
  • 我正在使用\s来匹配所有空格。
  • s是模式修饰符,可使.匹配包括换行符在内的任何字符。
  • 在捕获组之外匹配\s\R字符可以使替换文本与相邻文本很好地吻合。

代码:(Demo

$text = 'Some text at the start

{{if|service_name=DJ Booth}}
  This is the text for DJs
{{endif}}

Some text in the middle

{{if|service_name=Dancefloor Hire}}
  This is the text for dancefloor hire
{{endif}}

Some text at the end';

$service = "Dancefloor Hire";
echo preg_replace("/{{if\|service_name=$service}}\s*(.*?)\R{{endif}}/s", "$1", $text);

输出:

Some text at the start

{{if|service_name=DJ Booth}}
  This is the text for DJs
{{endif}}

Some text in the middle

This is the text for dancefloor hire

Some text at the end

扩展名:如果要擦除所有不合格的占位符,请执行第二遍操作并删除所有剩余的占位符。

Demo

echo preg_replace(["/{{if\|service_name=$service}}\s*(.*?)\R{{endif}}/s", "/\R?{{if.*?}}.*?{{endif}}\R?/s"], ["$1", ""], $text);