【发布时间】:2019-03-01 03:32:14
【问题描述】:
我有一个文本区域,我们的用户可以在其中将变量替换为真实的订单数据。
例如{{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 在多行上工作的问题
所以现在的输出是....
问题是可能有多个条件,所以我不能只预先匹配类型然后打印值,因为我需要遍历每个匹配,并替换匹配的文本而不是在底部输出.
所以我正在使用这个...
$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];
}
}
正确匹配,但只是将所有文本一起输出,而不是在它们匹配的同一位置。
所以我的问题是......
- 如何在现场进行更换?
谢谢!
【问题讨论】:
-
s多行点的模式修饰符。贪心匹配是个坏主意.*。多重条件声明是什么样的。你想如何匹配/避免它们? -
@mickmackusa 多个条件位于顶部文本的第一位。客户可能希望为 DJ 指定不同的文本,为舞池指定不同的文本,并且仅在预订该服务时才显示该文本。不幸的是,多行的 s 导致它匹配第二个 {{endif}}
-
它不是树枝,它是 saas 系统中的自定义变量(占位符)。我刚刚发现在预匹配中添加 U 会导致它“非贪婪”,并且 s 允许多行,我想我已经对多行问题进行了排序 - 只是没有替换文本。
-
找到匹配项后使用
preg_replace_callback替换它们。 -
是的,是的。
标签: php regex preg-replace preg-match