首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Apostrophe的PHP正则表达式失败

使用Apostrophe的PHP正则表达式失败
EN

Stack Overflow用户
提问于 2015-03-28 02:26:19
回答 2查看 172关注 0票数 1

首先,我不经常使用正则表达式,所以我想我应该在这里抛出这一点。

我有一个正则表达式,用来查找除我想要允许的字符之外的任何特殊字符。

代码语言:javascript
复制
$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;
}

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

代码语言:javascript
复制
/[^\w\-\'\.\s]/

在我的环境中,这似乎对除撇号以外的所有东西都有效。但是,当我将这个正则表达式放在PHP Live Regex中时,它似乎适用于所有内容。

你知道这是怎么回事吗?

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

EN

回答 2

Stack Overflow用户

发布于 2015-03-28 04:15:36

事实上,上面的逻辑是可行的。这个问题与preg_match中$string变量中的数据有关。在设置名称和地址变量时,我必须添加html_entity_decode($NameAndAddressData,ENT_QUOTES)

票数 2
EN

Stack Overflow用户

发布于 2015-03-28 05:32:30

使用[^\w]排除所有字母数字,它不是特殊字符。最重要的是你有一个大小为1的被否定的字符类,这意味着在整个字符串中只有1个字符被检查匹配,我怀疑你需要检查所有的字符是否都不属于排除的类。

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

代码语言:javascript
复制
$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";
}

输出:

代码语言:javascript
复制
false 1 ('My bad string' has spaces)
true 2  ('Goodstring' is OK)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29307694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档