高效地将一长字符串分解并修剪为单个数组

4

我正在尝试创建一个消息系统,可以同时向单个或多个用户发送消息。从我的表单中传递的值如下所示:

<Username One(1)><Username Two(2)><Username Three(3)>

现在,为了将这些信息发布到数据库中,我想要将其分解并切割成三个独立的部分,而所有这些都在一个数组中。

我希望输出的结果类似于这样:

Array[0] = 1
Array[1] = 2
Array[2] = 3

我尝试使用 explode(">", $input_value); 然后使用 preg_match 进行修剪,但最终得到两个单独的数组。如何将这两个组合起来并获得想要的结果?应该尽可能有效,因为每个用户应该能够同时向最多数量的用户发送消息。 此外,我会很感激对正则表达式进行易于理解的解释,因为我发现它有点令人困惑。

你是否在标签内得到了值? - Narendrasingh Sisodia
我正在获取括号内的值,是的。 - Gjert
1
你为什么不使用现成的数据结构,比如 json 或者 xml?已经有现成的方法/扩展可以处理它们(例如 json_decode() 和 SimpleXML)。 - Jasper N. Brouwer
@JasperN.Brouwer 我以前从未使用过这些。我可能会去看一下。谢谢你的提醒 :) - Gjert
2个回答

1

您可以使用:

$s = '<Username One(1)><Username Two(2)><Username Three(3)>';    
preg_match_all('~\b[\p{L}\p{N}]+(?=\h*\)>)~u', $s, $m);    
print_r($m[0]);

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

(?=\h*\)>)是一个正向预查,匹配)>前面的单词。


即使用户使用独特的字母注册,如中文、æøåöäë,并在用户名中包含数字,这也可以正常工作吗? - Gjert
我使用了以下代码:$msg_all_receivers = $_POST['receiver']; preg_match_all('~\b\w+(?=\)>)~', $msg_all_receivers, $msg_all_receivers_exp); 并用以下代码输出:echo $msg_all_receivers_exp[0].$msg_all_receivers_exp[1]; 然而,我收到了错误信息:Notice: Undefined offset: 1 in /home/connecti/www/projects/send_message.php on line 328,随后是 Array - Gjert
你必须使用:echo $msg_all_receivers_exp[0][0].$msg_all_receivers_exp[0][1]; 另请参阅更新的答案以支持Unicode。 - anubhava
啊,好的,谢谢。count()函数会作用于底层数组吗?还是只会计算1个元素? - Gjert
那我应该这样做 $count = count($m[0]) 吗? - Gjert

1

由于您的字符串中包含数字1、2、3,因此您可以从字符串中获取所有数字

<?php
$str="<Username One(1)><Username Two(2)><Username Three(3)>";
preg_match_all('!\d+!', $str, $matches);
print_r($matches[0]);

第二件事是,所有在()括号中的字符串。
preg_match_all("/\((.*?)\)/", $str, $matches);

print_r($matches[0]);

1
如果用户使用数字注册,这将无法保证未来的兼容性。或者我错了吗? - Gjert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接