说我有以下数组和字符串:
$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更好?恭喜收到任何意见:)
答案 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)
我不打算在这里使用正则表达式,从头到尾简单扫描字符串,寻找'$'字符然后在数组上执行二进制搜索会更简单,更快。