使用撇号失败的PHP正则表达式

时间:2015-03-27 18:26:19

标签: php regex

首先,我不经常使用正则表达式,所以我想我会把它扔出去。

我正在使用正则表达式来查找除了我想要允许的特殊字符之外的任何特殊字符。

$allowed_special_characters_list = array('-', "'", '.');
$excluded_special_characters = '';

foreach($allowed_special_characters_list as $excluded_special_character){
    $excluded_special_characters .= "\\".$excluded_special_character;
}

if(preg_match("/[^\\w".$excluded_special_characters."\\s]/", $string)){
    return true;
}

当我输出这个正则表达式时,它给出了以下内容:

/[^\w\-\'\.\s]/

这似乎适用于我环境中除撇号之外的所有事情。但是,当我将这个精确的正则表达式放在PHP Live Regex中时,它似乎适用于所有内容。

关于这个问题的任何想法?

编辑:上面的代码是我实际使用的简化版本。我正在从配置文件中的数组动态构建此正则表达式。每当我们需要添加另一个特殊字符时,我们只需要将它输入到数组中。

2 个答案:

答案 0 :(得分:2)

事实上,上述逻辑确实有效。问题与preg_match中$ string变量中的数据有关。设置名称和地址变量时,我必须添加 html_entity_decode($ NameAndAddressData,ENT_QUOTES)

答案 1 :(得分:0)

你的正则表达式最可能的问题是你在1个正则表达式中混合允许和不允许的字符。

您使用[^\w]排除所有字母数字,它不是特殊字符。另外,检查是否还需要允许多个单词,因为在排除的字符类中有\s。最重要的是你有一个大小为1的否定字符类,这意味着在整个字符串中只检查一个字符以进行匹配,我怀疑你需要检查所有字符是否属于排除的类。

因此,您需要的正则表达式类似于^[^\-\'\.\s]*$(将禁止多个单词,前导/尾随空格),以及检查单词是否经过验证的代码是:

$string = 'My bad string';
$string2 = 'Goodstring';
$re = "/^[^".$excluded_special_characters."\\s]*$/";
if(!preg_match($re, $string)){
    echo "false 1\n";
}
if(preg_match($re, $string2)){
    echo "true 2\n";
}

输出:

false 1 ('My bad string' has spaces)
true 2  ('Goodstring' is OK)