条件正则表达式如果Number为+1或等于字符串后面的特定数字

时间:2014-02-27 14:05:48

标签: php regex

我有一个正则表达式:

 /^ETW([0-9C])([0-9])([0-9])([0-9])([0-9])([A-L])([0-9])([0-9])([0-9])/g

符合以下条件:

  1. 字符1始终是字母字符 - E
  2. 字符2始终是字母字符 - T
  3. 字符3始终是字母字符 - W
  4. 字符4可能只是任何数字0 - 9或字母C(不允许使用其他字母字符)
  5. 字符5可能只是任何数字0 - 9(无字母字符)
  6. 字符6可能只是任何数字0 - 9(无字母字符)
  7. 字符7可能只是任何数字0 - 9(无字母字符)
  8. 字符8可能只是任何数字0 - 9(无字母字符)
  9. 字符9始终是以下字母字符之一-A,B,C,D,E,F,G,H,I,J,K,L(不允许使用其他字母字符)
  10. 字符10可能只是任何数字0 - 9(无字母字符)
  11. 字符11可能只是任何数字0 - 9(无字母字符)
  12. 字符12可能只是任何数字0 - 9(无字母字符)
  13. 所有这些条件都符合我的RegEx,但现在又出现了另一个问题,Character 12只能来自Equal to Character 10 +1 onlyCharacter 10 }

    我怎样才能实现这一目标?我已经尝试了条件RegEx,但它没有用,任何人都可以帮我解决这个问题吗? 我是否必须务实地处理它我很抱歉我对RegEx条件处理真的很新,任何帮助材料也会有用。

1 个答案:

答案 0 :(得分:2)

一种方法是将其拆分为两个单独的匹配操作,使用第一个匹配操作创建第二个匹配操作。

function isValidFormat($str)
{
    $pt1 = substr($str,0,10);
    $r1 = '#^ETW(\d|C)(\d)(\d)(\d)(\d)([A-L])(\d)#';
    //If you're not going to use all the match groups, use
    //$r1 = '#^ETW(\d|C)\d{4}[A-L](\d)#';
    //And instead of $matches[7], use $matches[2]
    if(preg_match($r1,$pt1,$matches)>0)
    {
        $pt2 = substr($str,10);
        $pt10 = intval($matches[7]);
        $pt12M = $pt10==9 ? '9' : '('.$pt10.'|'.($pt10+1).')$';
        $r2 = '#\d'.$pt12M.'$#';
        return preg_match($r2,$pt2)>0;
    }
    else return false;
}
$isValid = isValidFormat('ETW09876D929');
var_dump($isValid);

您访问this link并点击run / F9进行测试