如何使用preg_match()返回无效字符?

时间:2014-06-24 16:32:32

标签: php regex preg-match

我要求在发布期间阻止我们网站上特定字段中的某些特殊字符(即它需要是服务器端。)我之前已经编写了一个用于前端验证的javascript函数,可以检查字符对用户输入的正则表达式:

// checks each character one at a time to see if it's valid, returns
// invalid characters:
//      field_name = string containing field name
//      field_data = string containing actual field content
//      pattern = regex
// Returns false if there are no invalid characters
function invalidCharacters(field_name, field_data, regex) {
    var pattern = new RegExp(regex);
    var field_array = field_data.split('');
    var field_length = field_array.length;
    var bad_chars = new Array();
    for (x = 0; x < field_length; x++) {
        if (!pattern.test(field_array[x])) {
            if (bad_chars.indexOf(field_array[x]) < 0) {
                bad_chars.push(field_array[x]);
            }
        }
    }
    var bc_len = bad_chars.length;
    var errMsg = field_name.indexOf('credit card') < 0 ? 'Your ' : 'The ';
    errMsg += field_name + " contains the following invalid character(s): " + bad_chars[0];
    if (bc_len > 1) {
        for (x = 1; x < bc_len; x++) {
            errMsg += ', ' + bad_chars[x];
        }
    }
    if (bc_len > 0) {
        return errMsg;
    } else {
        return false;
    }
}

我现在正试图将其翻译为PHP。显然我们无法在用户输入时进行检查,这很好,但我确实需要能够针对正则表达式检查发布的字符串并返回不符合的字符列表允许的角色。

我从这样的事情开始:

if(!preg_match('/^[a-z0-9:_\/-]+$/i', $fieldData,  $matches)) {
    // there's an invalid character
    error_log("bad character");
    error_log(print_r($matches, 1));
    $retArray['failedChars'] = $matches; // returns empty array, obviously
    $retArray['success'] = false;
}
else {
    // it's fine
    error_log("it's fine");
    $retArray['success'] = true;
}

它确实击中了if / then,但是如何返回不通过preg_match的字符列表?有没有比一次循环字符串更好的方法?

如果我输入ems(%$)作为$fieldData代表的字符串,则应返回包含(%,{{1}的数组}和$符号。

1 个答案:

答案 0 :(得分:2)

您可以使用preg_replace()替换您想要的每个角色。返回的内容将是一个字符串,其中包含您 想要的内容。然后,您可以使用str_split()将此字符串转换为数组:

if(!preg_match('/^[a-z0-9:_\/-]+$/i', $fieldData)) {
    $rest = preg_replace('/[a-z0-9:_\/-]+/', '', $fieldData);
    $arr = str_split($rest);
}

对于字符串ems(%$),这将生成以下数组:

Array
(
    [0] => (
    [1] => %
    [2] => $
    [3] => )
)

Demo