用regex替换string中的数组值?

时间:2012-02-06 22:52:18

标签: php regex

说我有以下数组和字符串:

$array  = array('$AA', '$AB', '$AC', '$ZZ');
$string = 'String mentioning $AA and $AB and $CZ and $MARTASS';

我想检查$ string是否匹配$ array。应检查$ string中以“$”开头的每个单词。在示例中,找到$ AA和$ AB的匹配项;不是$ CZ。所需的输出是:

String mentioning {MATCH} and {MATCH} and {NO-MATCH}

这可能是一个正则表达式,还是写几行PHP更好?恭喜收到任何意见:)

4 个答案:

答案 0 :(得分:0)

应该可以通过两个查找和替换,按此顺序完成:

第一

\b(($AA)|($AB)|($AC)|($ZZ))\b ---> {MATCH}

第二

\b$\w+\b ---> {NO-MATCH}

我不确定这是在PHP语法中,但它不应该太难实现。 \b是一个单词分隔符边界,我相信在PHP中是允许的。

编辑:您可能需要转义$,不确定它是否已分组。

答案 1 :(得分:0)

是的,这是可能的。请查看preg_replace_callback()文档中的示例。您将使用以下形式的替换调用:

function substituteVar($matches) {
    ...
}

...

$newString = preg_replace_callback("/\\$(\w+)/", 'substituteVar', $string);

我想我会将substituteVar()的内容留给读者作为"练习#34;。 : - )

答案 2 :(得分:0)

这应该有用......

<?php
  $string = 'String mentioning $AA and $AB and $CZ and $MARTASS';
  echo preg_replace_callback("/\\$\S+/",
    create_function('$a','return in_array($a[0],array("\$AA", "\$AB", "\$AC", "\$ZZ")) ? "{MATCH}" : "{NO-MATCH}";'),
    $string
  );
?>

正则表达式匹配$后跟一个或多个非空格(\S+),然后检查匹配的字符串是否在数组中(包含在create function definition中,因此它在范围内,并正确转义) )

答案 3 :(得分:0)

我不打算在这里使用正则表达式,从头到尾简单扫描字符串,寻找'$'字符然后在数组上执行二进制搜索会更简单,更快。