清理字符串,使其对某个正则表达式有效

时间:2014-01-20 05:12:56

标签: php regex validation

我有一套规则来验证某些输入。我正在使用正则表达式来测试输入是否有效。这是我的代码。我有大约20条规则,但在这里只显示了2条。

$rules    = array( 'telnum' => '/^[0-9,+]+$/i', 'firstname'=>'/^[a-z\'-]+$/i');

说我要验证电话号码。

$match = ((bool)preg_match($rules['telnum'], $str));

工作正常。现在在某些情况下,我需要解析一些信息并清理它们,以便它们根据这些规则有效。我已经知道要使用preg_replace。我可以使用相同的规则来清理字符串,还是需要对规则进行某些更改?如

$cleanstr = preg_replace($rules['telnum'] , '', '+1 (214) 662-2590');

不适合我。它应返回+12146622590,但它返回相同的字符串'+ 1(214)662-2590'。

编辑 - 请注意,代码不会检测哪个规则适用于字符串。我将具体说明每个字符串使用的规则。据我所知,字符串是电话号码还是名字。

1 个答案:

答案 0 :(得分:0)

有一种方法。您可以从输入字符串中删除sybmols,并检查每个组合的模式。因此,您必须从输入字符串生成擦除sybmols的所有组合。对于'+ 1(214)662-2590'字符串,它将是 131072 组合。

例如。

$string = '+1 (214) 662-2590';
$pattern = '/^[0-9,+]+$/i';

$strlen = strlen($string);
$iterations = pow(2, $strlen);

for ($i = 0; $i < $iterations; $i++)
    {
    $tmp_string = $string;
    $number = $i;
    $k = 1;
    while ($number)
        {
        if ($number % 2)
            $tmp_string = substr_replace($tmp_string, '', $strlen - $k, 1);
        $number = (int) ($number / 2);
        $k++;
        }

        if (preg_match($pattern, $tmp_string))
            {
            var_dump($tmp_string); // string(12) "+12146622590" 
            break;
            }
        }

使用此功能,您可以使用验证表达式而无需编辑它:^)