strpos没有返回正确的结果

时间:2014-02-13 20:23:02

标签: php linux shell-exec strpos

我一直在抨击谷歌试图解决这个问题,我所能找到的是那些不明白strpos返回找到的字符串位置的人,所以0是一个有效值。这不是我的问题....简而言之:

$services=shell_exec('ps aux | grep udp');
print_r(is_string($services));
print_r($services);

返回:

1
root       833  0.0  0.1   1852   768 ?        S    19:25   0:00 daemon -r -n udp-server1 /usr/bin/ncd/udp-server.php wifi:3333:true:true.
root       834  0.0  0.1   1852   768 ?        S    19:25   0:00 daemon -r -n udp-server2 /usr/bin/ncd/udp-server.php network:13000:false:false.
root       848 48.6  2.3  37036 11744 ?        R    19:25  18:07 /usr/bin/php /usr/bin/ncd/udp-server.php wifi:3333:true:true.
root       849 48.6  2.3  37064 11780 ?        R    19:25  18:07 /usr/bin/php /usr/bin/ncd/udp-server.php network:13000:false:false.
www-data  1675  0.0  0.0   1368   444 ?        S    20:02   0:00 sh -c ps aux | grep udp
www-data  1677  0.0  0.1   1456   528 ?        S    20:02   0:00 grep udp

然而,这是我期望的结果:

$statuses=explode("\n",file_get_contents('/var/www/misc/udp-settings.inc'));
print_r($statuses);
foreach($statuses as $status){
    print_r(strpos($services,$status)===false);
}

返回:

Array ( [0] => wifi:3333:true:true [1] => network:13000:false:false [2] => )
1
1
1

这显然是错误的,因为字符串绝对存在于大海捞针中。我也尝试过stripos,mb_strpos,mb_stripos和preg_match,结果类似......我用is_string检查了一切,然后全部检查出来。我还在每个字符串的末尾附加''并用双引号包装每个字符串,试图输入两个字符串以使它们匹配(不确定这是否有意义,但我得到绝望的LoL)。

我很茫然,我怀疑udp-settings.inc文件是如何被编码的,但我真的不确定...我已经没有东西可以试试了真的有一些帮助,还有其他人有这类问题吗?

编辑:

要清楚我知道如果我将字符串直接复制并粘贴到php文件中,这是有效的,但这不是生产中的选项。我尝试过的另一件事是爆炸和破坏$ status的值,这给了我相同的结果。

如下面的评论所述,strlen返回相应的结果,我还用mb_detect_encoding检查了字符串,它们都返回ASCII

2 个答案:

答案 0 :(得分:0)

我无法确认您的发现,只是使用最新的PHP测试:

<?php

$haystack =
  "root       833  0.0  0.1   1852   768 ?        S    19:25   0:00 daemon -r -n udp-server1 /usr/bin/ncd/udp-server.php wifi:3333:true:true.
  root       834  0.0  0.1   1852   768 ?        S    19:25   0:00 daemon -r -n udp-server2 /usr/bin/ncd/udp-server.php network:13000:false:false.
  root       848 48.6  2.3  37036 11744 ?        R    19:25  18:07 /usr/bin/php /usr/bin/ncd/udp-server.php wifi:3333:true:true.
  root       849 48.6  2.3  37064 11780 ?        R    19:25  18:07 /usr/bin/php /usr/bin/ncd/udp-server.php network:13000:false:false.
  www-data  1675  0.0  0.0   1368   444 ?        S    20:02   0:00 sh -c ps aux | grep udp
  www-data  1677  0.0  0.1   1456   528 ?        S    20:02   0:00 grep udp"
;

foreach ([ "wifi:3333:true:true", "network:13000:false:false" ] as $needle) {
  var_dump(strpos($haystack, $needle));
  echo PHP_EOL;
  var_dump((strpos($haystack, $needle) === false));
  echo PHP_EOL , PHP_EOL;
}

?>

输出

int(118)
bool(false)

int(257)
bool(false)

答案 1 :(得分:0)

这对我很有用,试试看(唯一真正的区别是trim状态和数组上空条目的验证以及找到/未找到的if / echo :

Live DEMO.

<?php
$services = <<<DATA
root       833  0.0  0.1   1852   768 ?        S    19:25   0:00 daemon -r -n udp-server1 /usr/bin/ncd/udp-server.php wifi:3333:true:true.
root       834  0.0  0.1   1852   768 ?        S    19:25   0:00 daemon -r -n udp-server2 /usr/bin/ncd/udp-server.php network:13000:false:false.
root       848 48.6  2.3  37036 11744 ?        R    19:25  18:07 /usr/bin/php /usr/bin/ncd/udp-server.php wifi:3333:true:true.
root       849 48.6  2.3  37064 11780 ?        R    19:25  18:07 /usr/bin/php /usr/bin/ncd/udp-server.php network:13000:false:false.
www-data  1675  0.0  0.0   1368   444 ?        S    20:02   0:00 sh -c ps aux | grep udp
www-data  1677  0.0  0.1   1456   528 ?        S    20:02   0:00 grep udp
DATA;

$statuses = <<<DATA
wifi:3333:true:true
network:13000:false:false

DATA;

$status = explode("\n",$statuses);
print_r($status);

foreach($status as $current_status)
{
    $new_status = trim($current_status);
    if (empty($new_status))
        continue;

    if (strpos($services,$new_status)!==false)
    {
        echo $new_status, " was found...\n";
    }
    else
    {
        echo $new_status, " was not found...\n";
    }
}

使用您的代码,它应该如下所示:

<?php
$services = shell_exec('ps aux | grep udp');
$statuses = explode("\n",file_get_contents('/var/www/misc/udp-settings.inc'));
$status = explode("\n",$statuses);
foreach($status as $current_status)
{
    $new_status = trim($current_status);
    if (empty($new_status))
        continue;

    if (strpos($services,$new_status)!==false)
    {
        echo $new_status, " was found...\n";
    }
    else
    {
        echo $new_status, " was not found...\n";
    }
}