在PHP中,我想从以下字符串中提取字符串Nickname
:to[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);