使用preg_replace的foreach只输出1个结果

时间:2014-09-09 04:22:12

标签: php

我遇到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;
}
?>

2 个答案:

答案 0 :(得分:2)

改为使用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/>';
}

答案 1 :(得分:0)

好吧,preg_match()只吐出第一个结果。找到第一个结果后停止。如果你read the documentation那么你就会知道。

如果您想获得所有比赛,则必须使用preg_match_all()

你的正则表达也没有经过深思熟虑。只要它不包含空白字符,它就会匹配任何东西(包括无效标签)。例如,@@!"#¤%之类的内容将匹配......

在编写正则表达式时,通常最好尽可能地限制它。换句话说,它应该只匹配你需要的东西;使用像\S+之类的通配符,除了少数几个字符外,它匹配所有,这很少是一个好主意。

这样的事情会有所改善。但是,它会匹配可能不匹配的内容(例如@user中的@@user~)。

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