preg_ replace仅输出1个结果的foreach


foreach with preg_replace only outputting 1 result

我的foreachpreg_replace()有问题。我有一个文本字符串,希望使用preg_replace()提取@符号之后的所有单词,然后创建一个数组,然后我可以使用它将每个值提交到数据库中。

目前,只有第一个结果被输出。你能帮我解决这个问题吗?:)

<?php
$status['message'] = 'Hello I would like to tag @james and @bob and @barry';
preg_match('/(?<=@)'S+/i', $status['message'], $match);
foreach($match as $tag) {
    // insert each result into database
    echo $tag;
}
?>

改用preg_match_all

--执行全局正则表达式匹配

$status['message'] = 'Hello I would like to tag @james and @bob and @barry';
preg_match_all('/(?<=@)'S+/i', $status['message'], $match);
foreach(reset($match) as $tag) {
    // insert each result into database
    echo $tag . '<br/>';
}

好吧,preg_match()只输出第一个结果。在找到第一个结果后,它停止。如果你阅读了文档,你就会知道这一点。

如果你想得到所有的匹配,那么你必须使用preg_match_all()

你的正则表达式也没有经过深思熟虑。只要不包含空白字符,它几乎可以匹配任何内容(包括无效标记)。例如,类似@@!"#¤%的东西将被匹配。。。

在编写正则表达式时,最好总是尽可能地限制。换句话说,它应该只匹配你需要的;使用像'S+这样的通配符,除了少数字符外,它与所有都匹配,这不是一个好主意。

这样的事情会有所改善。然而,它将匹配可能不应该匹配的内容(如@@user~中的@user)。

$regex = '/(?<=@)[a-zA-Z0-9_]+/';