我一直在抨击谷歌试图解决这个问题,我所能找到的是那些不明白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
答案 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 :
<?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";
}
}