我正在寻找在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");
}
?>
答案 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。
$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]
。 可以在常规字符类中使用它,但它本身可以正常工作。