Более быстрый тест на регулярное выражение PHP - PullRequest
0 голосов
/ 26 апреля 2018

Мне нужно очистить входящий JSON, который обычно имеет форму

'["P4950Zp550","P4950Zp575","P4950Zp600","P5000Zp550","P5000Zp575","P5000Zp600","P4975Zp550","P4975Zp600"]'

с количеством цифр после каждого P|M, p|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, который я мог бы написать, который мог бы сделать это в одном, без меня сначала json_decode во входящей строке. Мое знание RegExs находится в пределах с регулярным выражением, которое я создал здесь. Я был бы очень признателен всем, кто мог бы помочь

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Посмотрите, поможет ли это

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

Здесь выражение заключено в ()*, которое группирует внутреннее выражение и ищет любое количество вхождений (*) внутренней группы. Вы можете включить квадратные скобки также, если вы предпочитаете ...

0 голосов
/ 26 апреля 2018

Если вы действительно глубоко хотите проверить массив из 8 элементов за один проход, пока он все еще является строкой json, вы можете использовать это:

Шаблон: ~^\["[PM]\d{3,5}Z[pm]\d{3,5}(?:","[PM]\d{3,5}Z[pm]\d{3,5}){7}"]$~

Pattern 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

Иногда вам просто нужно выполнить массовую проверку ввода :]

0 голосов
/ 26 апреля 2018

Расшифруйте 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 с помощью регулярного выражения - плохая идея.

...