更快的 PHP 正则表达式测试

A quicker PHP regex test

我需要清理通常采用

形式的传入 JSON
'["P4950Zp550","P4950Zp575","P4950Zp600","P5000Zp550","P5000Zp575","P5000Zp600","P4975Zp550","P4975Zp600"]'

每个 P|Mp|m 之后的位数在 3 和 5 之间变化。json_decoding 然后应用测试

preg_match('/(P|M){1}[0-9]{3,5}Z(p|m){1}[0-9]{3,5}/',$value)

八次,在 foreach 循环中,(我总是在数组中有八个值)将是一件小事。但是,我想知道是否可能没有我可以编写的 Regex,它可以在一个 one 中执行此操作,而不必在传入字符串中先 json_decode 。我对 RegEx 的了解仅限于我在此处创建的正则表达式。

解码JSON然后使用循环:

$json = '["P4950Zp550","P4950Zp,575","P4950Zp600","P5000Zp550","P5000Zp,575","P5000Zp600","P4975Zp550","P4975Zp600"]';
$array = json_decode($json, true);
foreach ($array as $value) {
    if (!preg_match('/^[PM]\d{3,5}Z[pm]\d{3,5}$/',$value)) {
        echo "Invalid value: $value<br>\n";
    }
}

DEMO

尝试用正则表达式解析原始 JSON 是个坏主意。

看看这是否有帮助

(\"[PM]\d{3,5}Z[pm](\,)?\d{3,5}\"(\,)?)*

此处,表达式包含在 ()* 中,它将内部表达式分组并查找内部组的任意次数 (*)。如果您愿意,也可以包括方括号...

如果您真的非常想在 8 元素数组仍然是 json 字符串时一次性验证它,您可以使用这个:

模式:~^\["[PM]\d{3,5}Z[pm]\d{3,5}(?:","[PM]\d{3,5}Z[pm]\d{3,5}){7}"]$~

Pattern Demo -- 这匹配第一个,然后是后面的七个;全部包裹得当。

代码 (Demo)

$string = '["P4950Zp550","P4950Zp575","P4950Zp600","P5000Zp550","P5000Zp575","P5000Zp600","P4975Zp550","P4975Zp600"]';

if (preg_match('~^\["[PM]\d{3,5}Z[pm]\d{3,5}(?:","[PM]\d{3,5}Z[pm]\d{3,5}){7}"]$~', $string)) {
    echo "pass";
} else {
    echo "fail";
}
// outputs: pass

有时,您只想批量验证输入