在 PHP 中,我想Nickname
从这个字符串中提取字符串:to[Nickname]
.
我试过使用preg_split()
但没有成功。
更新
我如何让它从“to [nickname]”中提取?括号前的“to”也很重要,因为它标识了用户发送的消息类型
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 action
as thekey
和 the detail
as 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
您可以使用正则表达式从[]
括号内提取文本
"/\[(.*?)\]/"
我不确定在这里使用哪个preg_match()
/preg_match_all()
是正确的,所以我只会给你应该工作的模式,并让你通过查找功能差异来学习其余部分。
从评论更新
preg_match("/to\[(.*?)\]/", $message, $nickname);
您可以使用正则表达式、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;