【问题标题】:PHP: fastest way to check for invalid characters (all but a-z, A-Z, 0-9, #, -, ., $)?PHP:检查无效字符的最快方法(除了 a-z、A-Z、0-9、#、-、.、$)?
【发布时间】:2010-12-16 16:44:25
【问题描述】:

我必须尽快检查到 PHP 套接字服务器的缓冲区输入。为此,我需要知道输入消息 $buffer 是否包含除以下字符之外的任何其他字符:a-z、A-Z、0-9、#、-、。和 $

我目前正在使用以下 ereg 函数,但想知道是否有优化速度的方法。我应该使用不同的函数还是不同的正则表达式?

if (ereg("[A-Za-z0-9]\.\#\-\$", $buffer) === false)
{
    echo "buffer only contains valid characters: a-z, A-Z, 0-9, #, -, ., $";
}

【问题讨论】:

  • ereg 已弃用;改用preg_ 函数

标签: php regex validation


【解决方案1】:

只允许字符 a-z 大写或小写..

if (preg_match("/[^A-Za-z]/", $FirstName))
{
    echo "Invalid Characters!";
}

添加数字..

if (preg_match("/[^A-Za-z0-9]/", $FirstName))
{
    echo "Invalid Characters!";
}

添加其他字符以允许(在本例中为感叹号)..

(如图所示,其他字符必须以“\”开头。)

if (preg_match("/[^A-Za-z0-9\!]/", $FirstName))
{
    echo "Invalid Characters!";
}

【讨论】:

  • 如果我需要多个附加字符怎么办?我是用逗号还是另一个 / 分隔它们?
【解决方案2】:

试试这个功能:

function isValid($str) {
    return !preg_match('/[^A-Za-z0-9.#\\-$]/', $str);
}

[^A-Za-z0-9.#\-$] 描述任何无效的字符。如果preg_match 找到匹配项(无效字符),它将返回1,否则返回0。此外,!1false!0true。因此,isValid 如果找到无效字符则返回 false,否则返回 true

【讨论】:

  • 不会。 (点)匹配什么?
  • @sivann 不,不在字符类中。
【解决方案3】:

您需要改用preg 而不是eregereg 系列函数已被弃用,并且(从 php 5.3 开始)使用它们会引发 PHP 警告,并且它们将很快从语言中删除。此外,普遍认为 preg 函数比 ereg 更快。

至于速度,根据我的经验和我在职业生涯中看到的代码库,此时优化这种字符串性能还为时过早。将比较包装在一些逻辑函数或方法中

//pseudo code based on OP 
function isValidForMyNeeds($buffer)
{
    if (ereg("[A-Za-z0-9]\.\#\-\$", $buffer) === false)
    {
        echo "buffer only contains valid characters: a-z, A-Z, 0-9, #, -, ., $";
    }
}

然后当/如果您确定这是一个性能问题,您可以在一个地方应用任何需要的优化。

【讨论】:

  • 既然现在可以轻松解决问题,为什么还要等到问题出现?我相信没有那么多功能可以做到这一点,所以应该不会太麻烦,对吧?
  • 你的正则表达式是错误的,ereg 总是返回一个整数。
  • @gumbo:代码示例旨在更能说明包装函数的概念,而不是修复特定的正则表达式 @tom 足够真实,我的帖子只是关于这个主题的一个选项.但这种优化往往是无止境的。例如,现在您正在等待这个问题的答案,而您可以继续解决应用程序中的另一个问题。此外,PHP 中字符串比较的性能很大程度上取决于输入变量。
  • 同样,帖子的重点不是正则表达式,它只是从 OP 中复制而来的。
  • 别在意我,我完全忽略了你已经提到过 ereg 函数的弃用(和删除)的事实!对此感到抱歉。
【解决方案4】:

preg 系列函数比ereg 快很多。要测试无效字符,请尝试以下操作:

if (preg_match('/[^a-z0-9.#$-]/i', $buffer)) print "Invalid characters found";

【讨论】:

  • 您的正则表达式缺少文字 -,因为 #-$ 描述了一系列字符。
【解决方案5】:

preg_match 比 ereg 更快更强大:

if(preg_match('/^[^a-z0-9\.#\-\$]*$/i', $sString) > 0) //check if (doesn't contain illegal characters) is true
{
  //everything's fine: $sString does NOT contain any illegal characters
}

或转身:

if(preg_match('/[a-z0-9\.#\-\$]/i', $sString) === 0) //check if (contains illegal character) is false
{
  //everything's fine: $sString does NOT contain any illegal characters
}

【讨论】:

  • 字符串 "0test1#test1#a1.0.000$" 对于你的两个函数都返回 false,我应该反转它们的返回吗?
  • 您的正则表达式错误。 /^[^a-z0-9\.#\-\$]*$/ 表示只有[a-z0-9\.#\-\$] 以外的其他字符/[a-z0-9\.#\-\$]/ 表示[a-z0-9\.#\-\$] 中的至少一个字符
  • 如果您只想要指定的字符,或者除了指定的字符之外的任何内容,我并不完全清楚。
  • 秋葵;如果 OP 想要除了这些字符之外的所有内容,那么据我所知,我的两个函数都可以正常工作。我只是不完全清楚他想要什么......
  • 好吧,那我一开始误会你了。只需在第一个函数中删除 [ 之后的第二个 ^,您就可以开始了。
【解决方案6】:

用 preg 代替,它更快,而且 ereg 已经停产了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2011-03-12
    • 2015-02-23
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多