preg_match для проверки строковых кодов
Мне нужно проверить эти коды в php с preg_match, но я не управляю регулярными выражениями:
R{1 TO 12}-{00 TO 99}-{00 TO 99}
Ej: R12-54-03
Y-{A TO Z}
Ej: YZ
Вы можете помочь мне с этой проблемой? Мне отказано с регулярными выражениями
весь код должен быть в верхнем регистре.
Этот вопрос проблематичен?
я использую этот код для разбора строки:
$parts = explode("-",strtotupper($row['ubicacion']));
if(!empty($parts)){
if(is_array($parts)){
if(count($parts)==3){
if((strlen($parts[0]==2) || strlen($parts[0]==3)) && strlen($parts[1]==2) && strlen($parts[2]==2){
$num = str_replace("R","",$parts[0]);
if(is_numeric($num) && is_numeric($parts[1]) && is_numeric($parts[2])){
if($num>=1 && $num <=12){
$parse = true;
}
}
}
}
}
}
2 ответа
Первая модель
То, что вы хотите достичь, это сопоставить несколько строк, содержащих диапазоны чисел. Регулярные выражения будут выполнять работу для диапазонов цифр, например
[0-9]
будет соответствовать любой цифре от 0 до 9. Сложно использовать RegExp для соответствия одному или нескольким диапазонам цифр, например, 1-17.
Я бы предложил разработать алгоритм, который будет разбивать строку на отдельные части и проверять каждую часть, чтобы определить, соответствует ли вся строка.
Вот пример:
function stringMatches($string) {
// is the first character NOT the 'R' letter
if (0 !== strpos($string, 'R')) {
return false;
}
$parts = explode('-', substr($string, 1));
// is there more (or less) dash-separated numbers than 3
if (count($parts) !== 3) {
return false;
}
// is the first number NOT from 1-12 range
if ($parts[0] > 12 || $parts[0] < 1) {
return false;
}
// is the second number NOT from range 0-99 except the '00' case
if ($parts[1] !== '00' && ($parts[1] > 99 || $parts[1] < 1)) {
return false;
}
// is the third number NOT from range 0-99 except the '00' case
if ($parts[2] !== '00' && ($parts[2] > 99 || $parts[2] < 1)) {
return false;
}
// the string is ok
return true;
}
$string = 'R12-54-03';
stringMatches($string); //will return TRUE if the string is OK
Как видите, функция довольно большая, но я могу заверить вас, она намного быстрее, чем простейший RegExp.
Вторая модель
Когда дело доходит до второго шаблона - Y-{A-Z}
Здесь RegExp будет более простым и быстрым подходом:
preg_match('/Y-[A-Z]/', $string);
preg_match_all('/R([1-9]|1[012])-(\d{2})-(\d{2})/', 'R12-54-03', $mats);
preg_match_all('/Y-([A-Z])/', 'Y-Z', $mats);