我需要在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;
}
}
}
}
}
}
答案 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);