只有One @ Character的正则表达式是什么?

时间:2014-05-23 21:42:17

标签: php regex input character

我正在寻找在PHP中使用的正则表达式,以匹配一个字符; @符号。

例如,如果我在输入中键入:P@ssword,则正则表达式将匹配。如果我在输入中键入P@@ssword,则正则表达式将不匹配。

这是我正在使用的PHP代码:

<?php
  session_start();

  if($_SERVER['REQUEST_METHOD'] == "POST") {
$conn=mssql_connect('d','dd','d');
mssql_select_db('d',$conn);
if(! $conn )
{
  die('Could not connect: ' . mssql_get_last_message());
}

    $username = ($_POST['username']);
    $password = ($_POST['password']);
 if (preg_match("[\W]",$_POST["password"]))
  {
if (!preg_match("^[^@]*@[^@]*$",$_POST["password"]))
{
 header("location:logingbm.php");
} else {    
}
  }
if(!filter_var($_POST['username'], FILTER_VALIDATE_EMAIL))
  {
    if ($_POST["username"])
 {
   if ($_POST["password"])
  {
        $result = mssql_query("SELECT * FROM staffportal WHERE email='".$username."' AND
      password='".$password."'");
  if(mssql_num_rows($result) > 0) {
      $_SESSION['staff_logged_in'] = 1;
      $_SESSION['username'] = $username;
    }}}} else { 

    if ($_POST["password"])
  {
        $result = mssql_query("SELECT * FROM staffportal WHERE email='".$username."' AND
      password='".$password."'");
  if(mssql_num_rows($result) > 0) {
      $_SESSION['staff_logged_in'] = 1;
      $_SESSION['username'] = $username;
  }}}}

  if(!isset($_SESSION['staff_logged_in'])) {
    header("location:logingbm.php");
    echo "<script>alert('Incorrect log-in information!');</script>";
  } else {
    header("location:staffportal.php");
  }
?>

5 个答案:

答案 0 :(得分:2)

其他轻量级方法......

没有正则表达式

只需使用substr_count(请参阅demo

<?php
$str1 = "pa@s@s";
$str2 = "pa@ss";
echo (substr_count($str1,"@")==1)?"beauty\n":"abject\n"; // abject
echo (substr_count($str2,"@")==1)?"beauty\n":"abject\n"; // beauty

使用正则表达式

编辑:只是看到Sam写了等同的东西。

如果你想使用正则表达式,你可以使用这个相当简单的正则表达式:

@

如何?此代码(请参阅demo

<?php
$str1 = "pa@s@s";
$str2 = "pa@ss";
$regex = "~@~";
echo (preg_match_all($regex,$str1,$m)==1)?"beauty\n":"abject\n"; // abject
echo (preg_match_all($regex,$str2,$m)==1)?"beauty\n":"abject\n"; // beauty

答案 1 :(得分:1)

最简单的方法是使用preg_match_all()的返回值。

  

返回完整模式匹配的数量(可能为零),如果发生错误则返回FALSE。

Example:

$count = preg_match_all('/@/', $password, $matches);

非正则表达式解决方案(基于@ cdhowie&#39;评论):

$string = 'P@ssword';
$length = strlen($string);

$count = 0;
for($i = 0; $i < $length; $i++) {
    if($string[$i] === '@') {
        $count++;
    }
}

这是有效的,因为您可以access characters of Strings使用普通数组($var = 'foo'; $var[0] = 'f';)。

答案 2 :(得分:1)

这个正则表达式可以满足您的需求:

^[^@]*@[^@]*$

这匹配任何包含一个且只有一个@的行。

说明

  • ^匹配行的开头
  • [^@]*匹配@
  • 之前的所有内容
  • @与@ character
  • 相匹配
  • [^@]*匹配@
  • 之后的所有内容
  • $匹配行尾

使用

preg_match("#^[^@]*@[^@]*$#", $passwd); //Matches $passwd if it contains only one character

答案 3 :(得分:1)

正如我在评论中所说,您的模式需要分隔符/#~或您想要的任何内容(请参阅PHP文档并自行测试)。

要快速确定字符串只包含一个@,您可以这样做:

if (preg_match('~\A[^@]*@[^@]*\z~', $yourstr))
    echo 'There is one @';        
else
    echo 'There is more than one @ or zero @';        

答案 4 :(得分:1)

这是您的正则表达式代码的含义:

  

如果字符串([\W])中至少有一个非单词字符,则必须只有一个符号(@)。在at-sign之前和之后可能有任意数量的任何其他字符:字母,数字,控制字符,标点符号,任何东西。除@以外的任何内容。

我想知道的是,您是否试图说不超过一个 at-sign(即 one < / em>?)这在概念上非常简单;只是摆脱第一个正则表达式检查("[\W]")并将第二个正则表达式更改为:

"^[^@]*(?:@[^@]*)?$"

换句话说:

  

首先消费你看到的 not at-signs 。如果您看到@,请继续使用它,然后继续匹配 not at-signs 保留的任何内容。如果这不会让你离开字符串的末尾,那么它只能意味着有多个@。立即放弃尝试并报告失败的比赛。

当然,这仍然会让您忘记要允许的其他字符。我很确定[^@]*不是你想要的。

此外,"[\W]"可能正如您所希望的那样工作,但这只是偶然的。您可以将其写为"/\W/""~\W~" "(\W)",它的工作方式也相同。你可能意味着那些方括号形成一个字符类,但它们甚至不是正则表达式的一部分;他们是正则表达式分隔符

那你为什么这么做呢? \W是预定义的字符类,相当于[^\w]可以在常规字符类中使用它,但它本身可以正常工作。