在PHP中,我想从此字符串中提取字符串Nickname
:to[Nickname]
。
我尝试使用preg_split()
,但没有成功。
更新
我怎样才能从“to [nickname]”中提取它呢? “到” 在括号之前也有点重要,因为它标识了什么 用户发送的消息类型
答案 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}}