PHP检查编号的字符串是否遵循模式

时间:2018-07-06 16:22:17

标签: php

我正在比较不同版本号的输入,如下所示:

testname-v01.03.001.01
testname-v02.01.001.03
...

我正在做一个比较,以确保没有恶意输入任何内容以破坏我的sql表。

我正在做的事情是这样的:

<?php
    function startsWith($needle, $haystack){
        return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== false;
    }
    $reqmethod = $_SERVER["REQUEST_METHOD"];
    $textInput = "";
    if( $reqmethod == "GET") {
        $textInput = $_GET["my_input"];
    }
    $stringComparison = "v02.01.001.01";
    if ( $textInput != ""){
        $valid_input = startsWith("testname", $textInput); #See if text starts with version
        #if not check if its a partial match
        if (!$valid_input){
            if(preg_match('/^[A-Z][0-9]+.[0-9].[0-9].[0-9]', $textInput)){
            $textInput= "version-" + $textInput;
        } else {
            $textInputReadOut = "BAD VALUE";
            $textInput= "";
        }
    }
?>

要使preg_match等于v01,我是否可以通过执行以下操作来解决这个问题:[A-Z][0-9][0-9]?我已经尝试过,但是变量返回的是 BAD VALUE (错误值)

参考:Checking a string against a pattern

2 个答案:

答案 0 :(得分:1)

看看您的正则表达式:

if(preg_match('/^[A-Z][0-9]+.[0-9].[0-9].[0-9]', $textInput)){

您缺少结尾/

必须为:

if(preg_match('/^[A-Z][0-9]+.[0-9].[0-9].[0-9]/', $textInput)){

此处为更正版本:

^[a-zA-Z][0-9]{2}\.[0-9]{2}\.[0-9]{3}\.[0-9]{2}

您可以使用 regexr 之类的工具来测试您的正则表达式。

答案 1 :(得分:0)

您的正则表达式与 ^)v1.2.3.4开头的字符串匹配,但您的$textInput则以testname开头(或其他包名称)。

您还对正则表达式进行了编码,它仅检查输入是否为无效。您的文本输入始终有效,因为它始终以testname开头,这意味着您始终会进入else,其中输出为BAD VALUE。就您当前的代码而言,只要$textInputtestname开头,输出就是BAD VALUE