PHP preg_match:排除空格

时间:2013-12-11 18:03:30

标签: php regex preg-match regex-negation

我正在研究一些验证包含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 );

注意:我宁愿不包含要验证的文件以检查其有效性。可能会有很多这些,我不能假设我总能控制他们的内容。我宁愿不将未知的第三方代码包含在我自己的代码中。

3 个答案:

答案 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因为它是模式的第一个捕获组)。