Php 仅授权字符的代码简化

Php 仅授权字符的代码简化,php,Php,我得到一个字符串,其中包含“@string.number(其他内容)”。 我想从start+1(=忽略@)过滤输入,直到得到不同于字母数字或'-'、''''''''.'的内容。 以下是我的功能: function _isCharAllowed($c) { return (ctype_alnum(str_replace(array('-', '_', '.'), '', $c))); } $f=1; while ($this->_isCharAllowed(mb_substr($st

我得到一个字符串,其中包含
“@string.number(其他内容)”
。 我想从start+1(=忽略
@
)过滤输入,直到得到不同于字母数字或
'-'、''''''''.'的内容。

以下是我的功能:

function _isCharAllowed($c)
{
    return (ctype_alnum(str_replace(array('-', '_', '.'), '', $c)));
}
$f=1;
while ($this->_isCharAllowed(mb_substr($str, $f, 1)))
    $f++;
$key=mb_substr($str, 1, $f-2);
我想要两样东西。首先,我对包含
'-'、''.'和'.'.'.
的字符串有一个问题,因为它不是我想要的:当有这样的字符串时,它会删除这些字符,将空字符串赋给ctype_alnum(),返回false:

php -r 'echo var_export((ctype_alnum("")), true)."\n";'
我想优化它。 你会怎么做?

为什么不使用

例如:

$pattern = '/[^a-z0-9\-\_\.]/';

$strs = [
'some_string-with234.a',
'ano^ther-st*ring-with´+º~º'
];

foreach ($strs as $str) {
    echo preg_replace($pattern, '', $str) . PHP_EOL;
}

您可以将它们替换为允许的字符,例如
a
。这样,字符串将永远不会为空


旁注:听到
ctype_alnum(“”)
返回
false
,我感到震惊(但并不惊讶)。这与手册上说的完全矛盾。。。在某些版本中,行为甚至有所不同:

您能给我们举一个输入和预期输出的例子吗<代码>°你说得对。这真是太。。。凌乱的好吧,这是经典的Php:mess,mess,mess。我猜他们试图在5.0中修复它(至少我是这样解释版本之间的变化的),但那时人们依赖于错误的行为…所以你的意思是“删除所有不是我想要的字符”?这样的话,我想我不知道在哪里停下来做一个mb_substr($str,$f,1))。。。我需要一个索引才能有一个子字符串(实际上字符串要复杂得多)