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);
Другие вопросы по тегам