0

我一直在尝试创建一个允许字母、数字和以下字符的正则表达式:_ - !? . ,

这是我到目前为止所拥有的:

/^[-\'a-zA-Z0-9_!\?,.\s]+$/      //not escaping the ?

还有这个版本:

/^[-\'a-zA-Z0-9_!\?,.\s]+$/     //attempting to escape the ? 

这些似乎都无法匹配以下内容:

“哦,为什么,哦,为什么这个正则表达式不起作用!它变得非常令人沮丧?令人沮丧 - 至少可以这么说。嘿,看,下划线_我想知道这次它是否会匹配?”

有人可以指出我做错了什么吗?我必须指出,我的脚本接受用户输入(在这种情况下是引号中的段落)并去除所有空白,因此实际输入没有空白。

谢谢!

更新:感谢 Lix 的建议,这就是我目前所拥有的:

/^[-\'a-zA-Z0-9_!\?,\.\s]+$/

但是,它仍然无法正常工作??

UPDATE2 好的,根据输入,这就是正在发生的事情。用户输入字符串,然后我通过以下函数运行字符串:

$comment = preg_replace('/\s+/', '',   
htmlspecialchars(strip_tags(trim($user_comment_orig))));

所以最后,用户输入只是一长串没有任何空格的字符。然后使用以下命令运行该字符串:

preg_match("@^[-_!?.,a-zA-Z0-9]+$@",$comment) 

什么可能在这里造成麻烦?

最后更新:

最终使用了这个正则表达式:

"@[-'A-Z0-9_?!,.]+@i"

谢谢大家!大声笑,一旦你发现我的错误在哪里,你会杀了我的!

好的,所以我有这段代码:

if(!preg_match($pattern,$comment) || strlen($comment) < 2 || strlen($comment) > 60){

天啊!!!我从不费心去看代码的 strlen 部分。当然每次都会失败...我只允许 60 个字符!!!!

4

4 回答 4

1

我得到以下代码按预期工作(运行 php5):

<?php
    $pattern = "@[-'A-Z0-9_?!,.\s]+@i";
    $string = "Oh why, oh why is this regex not working! It's getting pretty frustrating? Frustrating - that is to say the least. Hey look, an underscore_ I wonder if it will match this time around?";

    $results = array();
    preg_match($pattern, $string, $results);

    echo '<pre>';
    print_r($results);
    echo '</pre>';
?>

的输出print_r($results)如下:

Array
(
    [0] => Oh why, oh why is this regex not working! It's getting pretty frustrating? Frustrating - that is to say the least. Hey look, an underscore_ I wonder if it will match this time around?
)

在http://writecodeonline.com/php/上测试。

于 2012-12-27T23:57:57.043 回答
1

如有疑问,在类中转义非字母数字字符以进行匹配总是安全的,因此可以使用以下方法:

/^[\-\'a-zA-Z0-9\_\!\?\,\.\s]+$/

当通过正则表达式 tester运行时,这可以很好地找到与您的目标的匹配,所以我建议您在其他地方可能会遇到问题,如果这不能解决所有问题。

我假设您在实际尝试匹配时没有包括在目标周围使用的引号?由于您没有在...中构建双引号匹配

有人可以指出我做错了什么吗?我必须指出,我的脚本接受用户输入(在这种情况下是引号中的段落)并去除所有空白,因此实际输入没有空白。

在这种情况下,您不需要\s它是否正常工作。

于 2012-12-27T23:36:05.410 回答
0

在字符类中唯一具有特殊含义的字符是:

  • 破折号(因为它可以用作范围的分隔符),除非它在开头使用(因为在这种情况下它不是任何范围的一部分),
  • 右括号,
  • 反斜杠。

在“纯正则表达式”中,您的字符类可以写成:

[-_!?.,a-zA-Z0-9\s]

现在,您需要根据您的语言和字符串的编写方式来转义任何需要转义的内容。鉴于这是 PHP,您可以按原样采用上述示例。请注意,它\s 也会在字符类中进行解释,因此这将匹配字符类之外匹配的任何内容\s

虽然一些手册建议使用转义符以确保安全,但了解字符类的一般正则表达式规则并应用它们会导致结果更短且更易于阅读;)

于 2012-12-27T23:46:33.803 回答
0

没有必要在[]. 但是,\s不会在表达式中执行您想要的操作。您有两个选择:手动展开 ( /^[-\'a-zA-Z0-9_!?,. \t\n\r]+$/) 或使用交替 ( /^(?:[-\'a-zA-Z0-9_!?,.]|\s)+$/)。

请注意,我在\之前留下了,'因为我假设您将它放在 PHP 字符串中,并且我不想建议语法错误。

于 2012-12-27T23:38:48.003 回答