为了账号安全,请及时绑定邮箱和手机立即绑定

php:检查变量是否有/缺少特定字符

php:检查变量是否有/缺少特定字符

PHP
芜湖不芜 2023-07-15 15:44:51
我实际上有两个问题,但它们几乎是同一件事。no1,我想使用 PHP 来检查变量是否包含除正斜杠或数字之外的任何内容,我知道我可以用于strpos()此目的,但如果我执行类似的操作if (strpos($my_variable, "/")) {    if (1 === preg_match('~[0-9]~', $string)) {        //do something    }}上面的代码首先 if 语句检查变量是否包含正斜杠,然后下一步检查变量是否包含字母,但是如果有人输入类似“asdfgfds2345/”的内容作为出生日期,它将通过,因为该字符串包含正斜杠并且数字,但我的 PHP 脚本要做这样的事情if(/*my_variable contains letters,special characters and any other thing that is not a number or a forward slash*/){ do something}下一个问题:我想使用 PHP 来检查变量是否包含除小写字母、下划线或连字符之外的任何内容,我也知道我可以用于strpos()此目的,但如果我不能继续做这样的事情像这样if (strpos($my_variable, "/")) {    //redirect} else {    if (strpos($my_variable, "?")) {        //redirect    } else {        if (strpos($my_variable, "$")) {            //redirect        } else {            //do something        }    }}如果我尝试执行上述操作,我将需要很长时间才能完成此页面,所以有没有办法可以做到这一点$chars = "$""#""/""*";if ($myvariable contains any of the letters in $char){    //do something}我知道上面的代码在所有方面都是错误的,但我只是想向您展示我想要实现的目标
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

出生日期匹配:

如果您想验证出生日期格式(假设[D]D/[M]M/YY[YY],日和月可能为单位数字值),您可以按如下方式执行:


// This would match for any numbers:

if (preg_match('~^\d{1,2}/\d{1,2}/\d{2}(\d{2})?$~', $var)) {

    // proceed with valid date

} else {

    // protest much

}

在这里,我们使用^和$锚点(用于主题的^开头和$结尾)来断言主题$var必须只是这个(而不是包含它):[D]D/[M]M/YY[YY],或 1-2 位数字、斜杠、1-2 位数字、斜杠、2 或 4数字(注意(\d{2})?可选匹配)。


人们可以进一步调整正则表达式以匹配可接受的数字范围,但我相信现在就可以了。而是在后期处理中检查范围;您可能希望将其转换为时间戳(可能带有strtotime)和/或 SQL 日期时间,以便在任何情况下进一步使用。


您可以做的另一件方便的事情是立即捕获日期部分。在以下示例中,为了清楚起见,我们使用命名捕获组:


if (preg_match('~^(?<day>\d{1,2})/(?<month>\d{1,2})/(?<year>\d{2}(\d{2})?)$~', $var, $date)) {

    var_dump($date); // see what we captured.

} else {

    // nothing to see here, except a protest.

}

请注意包含匹配项的变量如何$date从条件检查行继续进行。您可以一步完成验证和解析,耶!结果(假设 20/02/1980 输入):


array(8) {

    [0] · string(10) "20/02/1980" // this is the complete subject

    ["day"] · string(2) "20"

    [1] · string(2) "20"

    ["month"] · string(2) "02"

    [2] · string(2) "02"

    ["year"] · string(4) "1980"

    [3] · string(4) "1980"

    [4] · string(2) "80" // this will only appear for 4-digit years

}

(非)匹配任何字符:

“我想使用 PHP 检查变量是否包含小写字母、下划线或连字符以外的任何内容”。就这么简单:


if (preg_match('~[^a-z_-]~', $var)) {

    // matches something other than a-z, _ and -

} else {

    // $var only has acceptable characters

}

这里^运算符对字符范围取反(仅在 内部[],否则是主题的开始)。如果您想进行肯定检查(例如有#、&、X),只需preg_match('~[#&X]~', $var). 花一点时间理解正则表达式是值得的。我仍然经常转向RegularExpressions.Info来刷新记忆或研究如何实现更复杂的表达式,但是还有大量其他资源。快乐搭配,


查看完整回答
反对 回复 2023-07-15
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

这是一个很好的用例,只需使用strstr()


strstr — 查找字符串的第一次出现


if (!strstr($a, '-')) {

  // No hyphen in $a

}


查看完整回答
反对 回复 2023-07-15
?
Qyouu

TA贡献1786条经验 获得超11个赞

您可以尝试使用这样的正则表达式:


if (preg_match('#[0-9/]#', $myvariable)) {

    //Do something

}


查看完整回答
反对 回复 2023-07-15
  • 3 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信