我正在研究一些验证包含PHP变量的配置文件的代码块。我想使用preg_match检测留空的变量。
如果文件包含以下行:
$db_host = "blablah";
$db_host ='blablah';
$db_host='';
$db_host=" ";
$db_host="";
我只想匹配3-4-5行,第1行和第2行有效(没有空值)。以下preg_match运行良好,但匹配所有行,不处理空格或空值;我怎么能只匹配空/空格值?
preg_match( '#\$db_host(\ +)?\=(\ +)?(\'|\")(.*?)(\'|\");#i', $string );
注意:我宁愿不包含要验证的文件以检查其有效性。可能会有很多这些,我不能假设我总能控制他们的内容。我宁愿不将未知的第三方代码包含在我自己的代码中。
答案 0 :(得分:3)
你的正则表达式应该如何检查这样的东西?:
$a = '';
$b = $a;
$c = preg_replace('/.*/', $a);
您应该使用PHP来检查变量而不是正则表达式:
include 'config.php';
foreach(array(
'db_host', 'db_pass', ...
) as $varname) {
$value = trim($$varname);
if(empty($value)) {
die($varname . ' must not be empty');
}
}
此外,您应该使用trim()
来避免仅包含空格内容的变量。 (感谢@SamuelCook)
答案 1 :(得分:2)
为什么在使用trim()
时可以使用preg_match& empty()
检查它是否为空。
采取以下示例:
<?php
$str[0] = ' ';
$str[1] = "\t";
$str[2] = "\r\n";
foreach($str as $k=>$val){
$val = trim($val);
if(empty($val)){
echo $k.' is empty<br>';
}
}
他们都会空着。
答案 2 :(得分:0)
您可以使用此模式:
$pattern = '~\$db_host\s*=\s*(["\'])\s*\1\s*;~';
\s*
表示“任何白色字符零次或多次”。白色字符是空格,制表符,回车符和换行符,但如果需要,可以将\s
替换为\h
,仅匹配水平白色字符(即制表符和空格)。
我将引用类型放在带有(["\'])
的捕获组中,然后使用\1
对该组进行反向引用(1因为它是模式的第一个捕获组)。