我正在比较不同版本号的输入,如下所示:
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 (错误值)
答案 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
。就您当前的代码而言,只要$textInput
以testname
开头,输出就是BAD VALUE
。