正则表达式为" {[string]}"或" {{[string] | [string]}}"

时间:2018-01-17 10:45:10

标签: php regex

我正在使用法语合同生成器来搜索" {}"之间的事物。并取而代之,但我无法制作符合我需求的产品。

以下是一个例子:

**Nom de l'{{apprenti | apprentie}}** : {train_PrenomPersonne} {train_NomPersonne}

双括号必须由其中的两个命题中的一个替换,具体取决于性别。必须用数据库中的值替换单个括号。

所以最终的结果应该是:

**Nom de l'apprenti** : Chuck Norris

为每种情况制作两个不同的正则表达式是否更简单,因为它们不是以相同的方式使用或者单个方式可以适用?

我只需要一个正确的正则表达式,我自己可以获得的最佳结果是第一个和最后一个括号之间的单个匹配。

1 个答案:

答案 0 :(得分:2)

您可以使用

{{1,2}
(?P<group1>[^{}|]+)\s*
(?:\|\s*(?P<group2>[^{}]+))?
}{1,2}

分别选择小组12

<小时/> 细分,这说:

{{1,2}                       # one or two {
(?P<group1>[^{}|]+)\s*       # capture anything not {}|
                             # into group 1
(?:\|\s*(?P<group2>[^{}]+))? # make the second group optional
}{1,2}                       # one or two }

您可能需要将trim()应用于group1以摆脱可能的尾随空格。
a demo on regex101.com

<小时/> 替换找到的示例的PHP中的一个可能示例可能是:

<?php

$data = "**Nom de l'{{apprenti | apprentie}}** : {train_PrenomPersonne} {train_NomPersonne}";

$regex = '~
                {{1,2}
                (?P<group1>[^{}|]+)\s*
                (?:\|\s*(?P<group2>[^{}]+))?
                }{1,2}
                ~x';

$replacements = ['apprenti' => 'Chuck Norris', 'train_PrenomPersonne' => 'Jack', 'train_NomPersonne' => 'Jones'];

$data = preg_replace_callback($regex,

    function($match) use ($replacements) {
        $group1 = trim($match["group1"]);
        $group2 = (isset($match["group2"]))?$match["group2"]:"";

        // now do sth. with group1 and group2
        return (isset($replacements[$group1]))?$replacements[$group1]:$group1;
    },
    $data);

echo $data;
?>

在这种情况下产生

**Nom de l'Chuck Norris** : Jack Jones