【问题标题】:Check if string does not have 6 digit number检查字符串是否没有 6 位数字
【发布时间】:2019-03-10 14:48:26
【问题描述】:

我正在尝试检查一个字符串是否没有任何 6 位数字。

$myString = "https://www.website.net/sometext/123456/";

if ( preg_match( '/([^0-9]{6})/', $myString ) ) {
    echo 'If'; 
} else {
    echo 'Else';
}

上面的代码回显if,它应该是假的。我不确定我错过了什么。

这就是我想要实现的目标:

"https://www.website.net/sometext/123456/" -> false
"https://www.website.net/sometext/"        -> true
"https://www.website.net/"                 -> true

【问题讨论】:

  • 只需让正则表达式检查它并交换条件。您可以单独使用正则表达式(负前瞻),但它的可读性较差。
  • 试试这个正则表达式:/([0-9]{6})/
  • 要检查任何地方的六位数,只需使用preg_match('/([0-9]{6})/', $myString)
  • 一个1234567不是六位数字,为什么要失败呢?

标签: php regex


【解决方案1】:

您可以使用(?<!\d)\d{6}(?!\d) 模式匹配一​​个 6 位数字。

您可以在preg_match 调用中使用它并否定结果:

if (!preg_match('~(?<!\d)\d{6}(?!\d)~', "text1234567 more text")) { 
    echo "Does not contain a 6 digit number"; 
}

或者,您可以将其添加到否定前瞻中并使用preg_match 而不使用否定:

if (preg_match('~^(?!.*(?<!\d)\d{6}(?!\d))~s', "text1234567 more text")) { 
    echo "Does not contain a 6 digit number"; 
}

请参阅PHP demo

模式详情

  • ^ - 字符串开头
  • (?!.*(?&lt;!\d)\d{6}(?!\d)) - 如果有匹配项,则匹配失败的负前瞻
    • .* - 尽可能多的任何 0+ 个字符(s 修饰符使 . 匹配任何字符)
    • (?&lt;!\d)\d{6}(?!\d) - 6 位数字,前面和后面都没有数字。

【讨论】:

    【解决方案2】:

    您的表达式匹配任何具有 6 个连续非数字字符的字符串。您需要匹配 6 位数字的字符串,然后反转结果:

    if ( ! preg_match('/([0-9]{6})/', $myString)) {
        ...
    }
    

    【讨论】:

      【解决方案3】:

      不要试图在正则表达式中说“不是这个”,而是在 PHP 中表达:

      if ( preg_match( '/([0-9]{6})/', $myString ) !== 1) {
          echo 'If'; 
      } else {
          echo 'Else';
      }
      

      您当前的正则表达式 /([^0-9]{6})/ 表示“6 个非数字字符”,而不是“不包含 6 个数字”。

      【讨论】:

        【解决方案4】:
        if (preg_match('/[0-9]\d{5}/',$myString)) {
            echo 'If';
        }else{
            echo 'else';
        }
        

        【讨论】:

        • 我可能遗漏了什么,但'/[0-9]\d{5}/'/[0-9]{6}/ 之间有什么区别?
        • 你没有遗漏任何东西,\d 是 [0-9] 的紧凑形式
        • \d 不是一回事,因为它匹配所有 Unicode 数字,包括来自其他脚本的数字,例如
        【解决方案5】:

        在使用\d{6}时,检查preg_match的结果是否为0:

        if ( preg_match( '/\d{6}/', $myString ) === 0) {
            echo 'If'; 
        } else {
            echo 'Else';
        }
        

        或者,如果您希望 preg_match 在字符串不包含任何此类数字的情况下返回 1,请从字符串的开头到结尾重复每个字符,同时对 6 个字符使用负前瞻:

        if ( preg_match( '/^(?:.(?!\d{6}))+$/', $myString )) {
            echo 'If'; 
        } else {
            echo 'Else';
        }
        

        还要注意[^0-9] 的意思是“除了数字之外的任何东西”——但是,它可以只与\D 元字符匹配。 (类似地,要匹配数字或[0-9],请使用\d - 不要使用字符集)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-16
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 2017-11-28
          • 1970-01-01
          相关资源
          最近更新 更多