preg_match用于验证字符串代码

时间:2013-12-05 11:45:07

标签: php preg-match

我需要在php中使用preg_match验证此代码,但我不管理正则表达式:

R{1 TO 12}-{00 TO 99}-{00 TO 99} Ej:R12-54-03

Y-{A TO Z} Ej:Y-Z

你可以帮我解决这个问题吗?我被正则表达式拒绝

所有代码都应该是大写的。

这个问题有问题吗?

我使用此代码来解析字符串:

$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 :(得分:1)

第一种模式

您希望实现的是匹配包含数字范围的某些字符串。正则表达式可用于数字范围,例如

[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);

答案 1 :(得分:1)

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);