从system()输出修剪PHP字符串

时间:2015-04-15 16:51:59

标签: php trim

我正在尝试修剪我从系统中获取的字符串(“dsquery user”); 运行命令时输出如下:

    "CN=Administrator,CN=Users,DC=server,DC=local"
    "CN=Guest,CN=Users,DC=server,DC=local"
    "CN=krbtgt,CN=Users,DC=server,DC=local"

我想要做的是我需要获得每个用户,所以我需要在CN =之后获取该部分并将其存储在数组中。 这是现在的代码:

<?php
$s=system("dsquery user");
$t=explode(" ", str_replace('"', "", $s));
for($i=0;isset($t[$i]);$i++)
{
    $y=explode("=", $t[$i]);
    $a[]=substr($y[1], 0, strpos($y[1], ","));
}
for($j=0;isset($a[$j]);$j++)
{
    echo $a[$j]."<br>";
}
?>

但我唯一得到的是最后一个用户,所以在这种情况下krbtgt .. 任何帮助都很受欢迎!

是否有遗漏的角色?

Copy pasted from terminal:

    "CN=Administrator,CN=Users,DC=dennizserver,DC=local"[End of Line(LF)]
    "CN=Guest,CN=Users,DC=dennizserver,DC=local"[End of Line(LF)]
    "CN=krbtgt,CN=Users,DC=dennizserver,DC=local"[End of Line(LF)]
Copy pasted from system output:
    "CN=Administrator,CN=Users,DC=dennizserver,DC=local"[Space]"CN=Guest,CN=Users,DC=dennizserver,DC=local"[Space]"CN=krbtgt,CN=Users,DC=dennizserver,DC=local"[Space]krbtgt

3 个答案:

答案 0 :(得分:1)

使用regular expressions

可以轻松解决此问题
$out = <<<END
    "CN=Administrator,CN=Users,DC=server,DC=local"
    "CN=Guest,CN=Users,DC=server,DC=local"
    "CN=krbtgt,CN=Users,DC=server,DC=local"
END;

$matches = array();
preg_match_all('/CN=([^,"]+)/', $out, $matches);

print_r($matches[1]);

打印:

Array
(
    [0] => Administrator
    [1] => Users
    [2] => Guest
    [3] => Users
    [4] => krbtgt
    [5] => Users
)

答案 1 :(得分:0)

您需要在使用之前定义$ a:

$s="CN=Administrator,CN=Users,DC=server,DC=local CN=Guest,CN=Users,DC=server,DC=local CN=krbtgt,CN=Users,DC=server,DC=local";
$t=explode(" ", str_replace('"', "", $s));
$a = array();
for($i=0;isset($t[$i]);$i++){
    $y=explode("=", $t[$i]);
    $a[]=substr($y[1], 0, strpos($y[1], ","));
}
for($j=0;isset($a[$j]);$j++)    {
    echo $a[$j] . "\n";
}

根据@ axiac的答案修改答案:

$s= <<<SYSTEM
    "CN=Administrator,CN=Users,DC=dennizserver,DC=local"[End of Line(LF)]
    "CN=Guest,CN=Users,DC=dennizserver,DC=local"[End of Line(LF)]
    "CN=krbtgt,CN=Users,DC=dennizserver,DC=local"[End of Line(LF)]
SYSTEM;

$matches = array();
preg_match_all('/CN=([^,"]+)/', $s, $matches);

echo print_r($matches, true);

这很好用并打印:

Array
(
    [0] => Array
        (
            [0] => CN=Administrator
            [1] => CN=Users
            [2] => CN=Guest
            [3] => CN=Users
            [4] => CN=krbtgt
            [5] => CN=Users
        )

    [1] => Array
        (
            [0] => Administrator
            [1] => Users
            [2] => Guest
            [3] => Users
            [4] => krbtgt
            [5] => Users
        )

)

然后你可以循环遍历$ matches数组,就像你已经在做的那样......

答案 2 :(得分:0)

最后使用正则表达式解决了它。 问题是系统输出只给了我最后一行,所以我需要将系统更改为exec并使用输出变量作为数组并循环通过它。 这是最终的解决方案:

<?php
$s=exec("dsquery user", $retval);
echo "<br \>";
$matches = array();
for($i=0;$i<3;$i++) {
    preg_match_all('/CN=([^,"]+)/', $retval[$i], $matches);
    echo $matches[1][0];
}
?>