首先,我不经常使用正则表达式,所以我想我应该在这里抛出这一点。
我有一个正则表达式,用来查找除我想要允许的字符之外的任何特殊字符。
$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中时,它似乎适用于所有内容。
你知道这是怎么回事吗?
编辑:上面的代码是我实际使用的简化版本。我从一个配置文件中的数组动态构建这个正则表达式。每当我们需要添加另一个特殊字符时,我们只需要将其输入到数组中。
发布于 2015-03-28 04:15:36
事实上,上面的逻辑是可行的。这个问题与preg_match中$string变量中的数据有关。在设置名称和地址变量时,我必须添加html_entity_decode($NameAndAddressData,ENT_QUOTES)。
发布于 2015-03-28 05:32:30
使用[^\w]排除所有字母数字,它不是特殊字符。最重要的是你有一个大小为1的被否定的字符类,这意味着在整个字符串中只有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)https://stackoverflow.com/questions/29307694
复制相似问题