【问题标题】:How can I check if the single chars are allowed? [closed]如何检查是否允许使用单个字符? [关闭]
【发布时间】:2012-10-16 17:45:46
【问题描述】:

我有一个包含 5 个单个字符的数组。应使用此正则表达式检查它们:

$regex = "/[a-zA-Z0-9]/";

如何检查是否允许使用单个字符?

【问题讨论】:

  • 要验证单个字符,您的表达式应该是 /^[A-Za-z0-9]$/^$ 锚点。否则,多字符表达式将匹配
  • 我们只能给你一个和问题一样好的答案,即How can I check if the single chars are allowed?你是什么意思?这是一个模糊的问题。
  • 坦率地说,你的英语需要一些润色。我没有难过的感觉,但是你写的文字越少,人们对你真正意思的假设就越多。或者反过来:你的问题越详细,你的英语知识影响就越小。

标签: php regex arrays preg-match pcre


【解决方案1】:

您也可以使用接受数组的preg_grep

$matchedArray = preg_grep("/[a-zA-Z0-9]/", $array);

根据文档:preg_grep 返回由与给定模式匹配的输入数组元素组成的数组。

那么你可以这样做:

if ($array === $matchedArray)
    echo "matched\n";

【讨论】:

  • 它是否可以返回类似 true 或 false 的信息,以便我知道它是否合法?
  • 好的,这正是我需要的,谢谢
【解决方案2】:

为什么不将它们作为字符串进行检查?

if (preg_match('/^[a-z0-9]+$/i',implode('',$yourCharArray)))
{
    echo 'all chars are ok';
}

哦,如果您想知道 /[a-z]/i/[a-zA-Z]/ 相同,i 是不区分大小写的标志。

如果您仍然希望/需要单独检查每个元素,因为您的评论让我相信:

foreach($yourChars as $char)
{
    if (!preg_match('/[a-z0-9]/i',$char))
    {
        echo 'Error: '.$char.' is not allowed';
    }
}

但在这种情况下,我建议不要使用正则表达式。只是:

if (!ctype_alnum($char))

会的,它速度更快,完全符合您的需要。 see the docs
再一次,内爆数组并检查结果字符串的长度仍然快很多:

$check = implode('',$charArr);
if (strlen($check) > 5 || !ctype_alnum($check))
{//more than 5 chars, other chars than a-z/0-9
    echo 'invalid input';
}
//if > 5 should be allowed, but the array elements should be single chars:
if (strlen($check) > count($charArr) || !ctype_alnum($check))

【讨论】:

  • 如果你想去那里,/[a-z\d]/i 会更短... :)
  • 单个字符串的唯一问题是您会丢失上下文。想象一个人输入了 4 个元素,但第一个元素输入了 2 个字符。这可能不再对他的其余程序进行验证,但对这个功能有效,如果这用于验证数据,它可能是一个有效的安全漏洞。
  • @Sammaye:刚刚在我的最后一次更新中解决了这个问题strlen($string) > count($array) :) @dualed:是的......我但这不应该是正则表达式的速成课程:)
【解决方案3】:

您遍历数组并一一检查它们是否匹配此模式?

【讨论】:

  • 嗯,听起来很合乎逻辑……但我也知道,问题是如何?
【解决方案4】:

您的正则表达式没有定义数量

您可以使用 {} 来执行此操作。以下正则表达式接受 1 到 5 个字符,由 []

指定

[a-zA-Z0-9]{1,5}

或者您可以使用“+”表示“一个或多个”,或者不使用逗号来表示固定数量的字符。

【讨论】:

  • 您不需要仅为多个字符模式定义单个字符的数量,因为它是每个数组中的 1 个字符,这在使用 ^$ 表示的循环中可能会更好该字符串中应该只存在一个字符。
【解决方案5】:

首先,如果你需要检查输入是否包含just模式,你需要添加锚点:

^pattern$

^ 是字符串/行的开头,$ 是它的结尾。

关于模式,使用这些>>

单个字符:

[a-zA-Z0-9]

没有或只有一个字符:

[a-zA-Z0-9]?

一个或多个字符:

[a-zA-Z0-9]+

一个或多个字符:

[a-zA-Z0-9]*

确切的字符数(n):

[a-zA-Z0-9]{n}

范围内的字符数(n,m):

[a-zA-Z0-9]{n,m}

n 个或更多字符:

[a-zA-Z0-9](n,}

不超过n个字符:

[a-zA-Z0-9]{0,n}

【讨论】:

    【解决方案6】:

    不确定我是否理解您的问题,但您可以循环数组吗?

    $myArray = ('0', 'a', 'b', 'c', 'L');
    $validArray = true;
    foreach ($myArray as $value) {
        if (preg_match("/[a-zA-Z0-9]/", $value) == 0)
                $validArray = false;
    }
    

    这将验证整个数组,您可以将其包装到一个函数中。但就像我说的,我不确定你到底需要什么。

    作为旁注,您可以从这里创建一个函数:

    function validateArray($arr) {
        $validArray = true;
        foreach ($arr as $value) {
            if (preg_match("/[a-zA-Z0-9]/", $value) == 0)
                    $validArray = false;
        }
        return $validArray;
    }
    
    $myArray = ('0', 'a', 'b', 'c', 'L');
    $myArrayValid = validateArray($myArray);
    

    【讨论】:

    • ok,所以 preg_match 返回一个 bool 来确定字符串是否与模式匹配
    • 对不起。我是一名 .NET 开发人员,所以我应该在发布之前看到它。 preg_match 如果找到匹配则返回 1,如果未找到则返回 0。已经编辑了我的答案以反映更改。
    • 使用 ! 更好,因为 preg_match 也可以返回 false,因为 false 或 0 是函数前的不正确值,应该会导致它引发错误 ! 是一个不错的选择因为它包含两个值。
    • 我也是 .NET 开发人员。而且我不擅长 php,这就是为什么我不得不问这些愚蠢的问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2014-10-14
    相关资源
    最近更新 更多