preg_match返回false

时间:2012-03-07 13:13:36

标签: php regex

我正在用php编写一个网页,它将提供一些与Minecraft服务器相关的有用工具和信息。我正在研究一个“状态指示器”,一个检测服务器是否有问题的系统。该系统的一个部分是使用shell_exec来检查系统上是否有运行的服务器应用程序。我正在使用preg_match来检查shell_exec的结果是否表明正在运行服务器应用程序。问题在于,无论我做什么,preg_match似乎总是返回false,这表示发生了错误。我找不到关于这个错误究竟是什么的任何细节。

function get_server_app_status($appName)
{
    if (preg_match($appName, shell_exec('ps aux | grep ' . $appName . ' | grep -v grep')) != 0)
    {
        return true;
    }
    else 
    {
        return false;
    }
}

我已经验证了shell_exec通过将其推入变量并使用调试器检查它的值以及检查$ appName来返回我想要的内容。两者都是字符串,并具有我想要的值。我还检查了preg_match以相同的方式返回什么,它确实返回false,而不仅仅是零。

4 个答案:

答案 0 :(得分:6)

在您的代码段中:

 if (preg_match($appName, shell_exec(...

$appName是有效的正则表达式吗?

你可能意味着:

if (preg_match("/" . preg_quote($appName) . "/", shell_exec(...

但如果$appName只是一个字符串,那么使用字符串比较函数比使用正则表达式更好,例如strcmpstrpos甚至{{1} }。

答案 1 :(得分:2)

如果$appName是字符串而不是正则表达式,请使用strpos

function get_server_app_status($appName) {
    return strpos($appName, shell_exec('ps aux | grep ' . $appName . ' | grep -v grep')) !== false;
}

答案 2 :(得分:1)

我实际测试了NULL的返回值。 这完美地运作了

function get_server_app_status($appName)
{
    $result = shell_exec('ps aux | grep ' . $appName . ' | grep -v grep');
    if (!is_null($result)) {
        // app is running
    } else {
        // app is NOT running
    }
}

答案 3 :(得分:1)

这是一种使用" pgrep"如果在您的服务器环境中可用。

<?php
function get_server_app_status($appName) {
  return shell_exec("pgrep $appName");
}

// Test driver
echo sprintf( "Running:%s".PHP_EOL, (get_server_app_status('httpd'))?'Yes':'No');
echo sprintf( "Running:%s".PHP_EOL, (get_server_app_status('java'))?'Yes':'No');

这是httpd的输出测试和不存在的情况。

[work]$ ./5 proc.php
Running:Yes
Running:No

注意:./5是我的PHP二进制文件的符号链接。