PHP,从方括号中解析出一个字符串


PHP, parsing out a string from within square brackets

在PHP中,我想从以下字符串中提取字符串Nicknameto[Nickname]

我尝试过使用preg_split(),但没有成功。

更新

我该如何从"to[昵称]"中提取?"收件人"括号之前也有点重要,因为它标识了什么用户发送的消息类型

preg_match()preg_split()更适合于此。这里我用的是环视法。正面看(?<=[[])后面的左括号[。一次或多次不是右括号的任何内容[^]]+和右括号(?=[]])的正面展望。!是我选择的分隔符。

<?php
    $string = "to[Nickname]";
    $pattern = "!(?<=[[])[^]]+(?=[]])!";
    preg_match($pattern,$string,$match);
    print($match[0]);
?>

输出

Nickname

更新

看看另一个问题,你似乎也想抓住短语的"to"部分。

<?php
$string = "to[Nickname]
from[Bob]
subject[This is what the message is about]";
    $pattern = "!([^[]+)'[([^]]+)']['n'r]+!";
    preg_match_all($pattern,$string,$matches);
    print_r($matches);
?>  

哪个输出:

Array
(
    [0] => Array
        (
            [0] => to[Nickname]
            [1] => from[Bob]
        )
    [1] => Array
        (
            [0] => to
            [1] => from
        )
    [2] => Array
        (
            [0] => Nickname
            [1] => Bob
        )
)

因此,为了使用这个例子中的变量,我们可以将它们存储在一个有意义的数组中。在这里,我将创建一个名为$actions的数组,并将action作为key,将detail作为value

foreach($matches[1] as $key=>$value){
    $actions[$matches[1][$key]]=$matches[2][$key];
}

要使用该数组,您只需在其中循环查找以下值:

foreach($actions as $action=>$detail){
    echo $action."=".$detail."'n";
}

更新输出

to=Nickname
from=Bob

您可以使用regex,一些strpos组合,也可以自己解析它。大多数时候我更喜欢自己解析字符串,但在PHP中,最快的解决方案通常使用strxxx函数。Regex也可以很快,但它们很难为复杂的情况编写,很难读取,也很难调试。以下是一些解析字符串的代码(请注意,它包括转义"]"字符的逻辑):

$input = 'to[somevalue]';
$length = strlen($input);
for($start = 0; $start < $length; $start++)
{
    $char = $input[$start];
    if($char == '[')
    {
        $start++;
        break;
    }
}
$out = '';
$escaped = false;
for($i = $start; $i < $length; $i++)
{
    $char = $input[$i];
    if($char == '''')
    {
        $escaped = true;
        continue;
    }
    if($escaped == false && $char == ']')
    {
        break;
    }
    if($escaped == true)
    {
        $escaped = false;
    }
    $out .= $char;
}
echo $out;

您可以使用正则表达式从[]括号中提取文本

"/'[(.*?)']/"

我不确定在这里使用哪个preg_match()/preg_match_all()是正确的,所以我只给你一个应该工作的模式,让你通过查找函数差异来学习其余的模式。

评论更新

preg_match("/to'[(.*?)']/", $message, $nickname);