需要正则表达式帮助 - 高级搜索和替换

时间:2014-06-17 18:17:24

标签: php regex

我有一个像

这样的字符串
"'Joe'&@[Uk Customers.First Name](contact:16[[---]]first_name) +@[Uk Customers.Last Name](contact:16[[---]]last_name)"

我的要求是开始寻找模式

@[A.B](contact:**digit**[[---]]**field**)

单个字符串中可以有许多模式。

并使用由数字字段

生成的动态文本替换为新字符串(应替换整个模式)

以上字符串的示例有两个匹配

第一场比赛是:数组(数字 => 16,字段 => first_name)

第二场比赛是:数组(数字 => 16,字段 => last_name)

在某处,我的规则很少

如果数字为16且字段为first_name,则用“John”替换模式 如果digit为16且field为last_name,则用“Doe”替换模式

所以输出字符串将是“'Joe'& John + Doe”

提前致谢。

1 个答案:

答案 0 :(得分:2)

匹配部分相当简单。这样就可以了:

@\[[^.]+\.[^.]+\]\(contact:(\d+)\[\[---\]\]([^)]+)\)

Regular expression visualization

Debuggex Demo

Regex101 Demo

在PHP(以及支持命名捕获组的其他语言)中,您可以执行此操作以使数组包含“digit”和“field”键:

@\[[^.]+\.[^.]+\]\(contact:(?<digit>\d+)\[\[---\]\](?<field>[^)]+)\)

示例PHP代码:

$regex = '/@\[[^.]+\.[^.]+\]\(contact:(?<digit>\d+)\[\[---\]\](?<field>[^)]+)\)/';
$text = '"\'Joe\'&@[Uk Customers.First Name](contact:16[[---]]first_name) +@[Uk Customers.Last Name](contact:16[[---]]last_name)"';


preg_match_all($regex, $text, $matches, PREG_SET_ORDER);

var_dump($matches);

结果:

array(2) {
  [0]=>
  array(5) {
    [0]=>
    string(55) "@[Uk Customers.First Name](contact:16[[---]]first_name)"
    ["digit"]=>
    string(2) "16"
    [1]=>
    string(2) "16"
    ["field"]=>
    string(10) "first_name"
    [2]=>
    string(10) "first_name"
  }
  [1]=>
  array(5) {
    [0]=>
    string(53) "@[Uk Customers.Last Name](contact:16[[---]]last_name)"
    ["digit"]=>
    string(2) "16"
    [1]=>
    string(2) "16"
    ["field"]=>
    string(9) "last_name"
    [2]=>
    string(9) "last_name"
  }
}

我不清楚你想要用于替换的逻辑,所以如果没有一些澄清,我恐怕无法提供帮助。