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

时间:2013-08-18 21:40:16

标签: php regex

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

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

更新

  

我怎样才能从“to [nickname]”中提取它呢? “到”   在括号之前也有点重要,因为它标识了什么   用户发送的消息类型

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式从[]括号

中提取文本

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

我不确定哪个preg_match() / preg_match_all()在这里使用是正确的,所以我只是给你一个应该有效的模式,让你通过查找功能差异。

从评论中更新

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

答案 1 :(得分: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;

答案 2 :(得分:2)

preg_match()preg_split()更适合这一点。我在这里使用look-arounds。左括号(?<=[[])的正面后视[。对于右括号[^]]+而言,任何不是右括号的任何内容都是(?=[]]),而对于右括号!则为正前瞻。 <?php $string = "to[Nickname]"; $pattern = "!(?<=[[])[^]]+(?=[]])!"; preg_match($pattern,$string,$match); print($match[0]); ?> 是我选择的分隔符。

Nickname

<强>输出

<?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);
?>  

<强>更新

看看其他一个问题看起来你也想要捕捉这个短语的“to”部分。

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

更新输出

{{1}}