1

在 PHP 中,我想Nickname从这个字符串中提取字符串:to[Nickname].

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

更新

我如何让它从“to [nickname]”中提取?括号前的“to”也很重要,因为它标识了用户发送的消息类型

4

3 回答 3

3

preg_match()比 更适合这个preg_split()。在这里,我使用look-arounds(?<=[[])左括号的正面后视[。任何不是右括号的内容一次或多次[^]]+,并且对右括号有积极的前瞻性(?=[]])。这!是我选择的分隔符。

<?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,我们将把 the actionas thekey和 the detailas the 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
于 2013-08-19T00:01:25.767 回答
2

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

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

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

从评论更新

preg_match("/to\[(.*?)\]/", $message, $nickname);
于 2013-08-18T21:45:58.560 回答
2

您可以使用正则表达式、strpos 的一些组合,或者您可以自己解析它。大多数时候我更喜欢自己解析字符串,但在 PHP 中,最快的解决方案通常使用 strxxx 函数。正则表达式也可以很快,但是对于复杂的情况它们很难编写、难以阅读和难以调试。这是一些解析字符串的代码(注意它包含转义“]”字符的逻辑):

$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;
于 2013-08-18T22:48:29.403 回答