仅限授权字符的代码简化

时间:2015-02-15 15:26:49

标签: php

我得到一个包含"@string.number (other stuff)"的字符串。 我想从开始+ 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";'

我想优化它。 你会怎么做?

2 个答案:

答案 0 :(得分:0)

为什么不使用preg_replace

示例:

$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;
}

答案 1 :(得分:0)

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

旁注:听到ctype_alnum("")返回false,我感到震惊(但并不感到惊讶)。这完全与手册所说的相矛盾......在某些版本中,行为甚至有所不同:http://3v4l.org/IEtdi