我遇到foreach
和preg_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;
}
?>
答案 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_]+/';