所以我正在处理一个项目,我正在将@misterFoo
转换为@[:1234]
(他的用户ID)。
这一切都有效,我很高兴,但我也想恢复这个。
我已经找出了捕获@[:1234]
的正则表达式,但是当这个字符串中出现第二次出现时:
"Joo @[:1234] my buddy @[:5678] want's his money back"
我的正则表达式只能获得@[:1234]
/(@\[:[0-9]])/
我可能错过了+
这样的多个单词或数字边界,或\b
有人可以解释我需要的内容吗?
现在我遇到了如何从1234
@[:1234]
的麻烦
答案 0 :(得分:0)
只需将匹配数字的模式放入捕获组内即可。
@\[:([0-9]+)\]
从组索引1中获取所需的字符串。
或强>
@\[:\K[0-9]+(?=\])
$re = "/@\\[:\\K[0-9]+(?=\\])/";
$str = "Joo @[:1234] my buddy @[:5678] want's his money back";
preg_match_all($re, $str, $matches);
答案 1 :(得分:0)
这里修复的是我为解决它而做的功能:
这是将字符串中的用户名转换为数据库
的@ [:id]的函数public function replaceUsernames($text){
$pattern = '/@\w+\b/';
preg_match_all($pattern, $text, $matches);
$sql = $this->db->prepare("
SELECT `id`
FROM `users` u
WHERE `username` = :username LIMIT 1
");
foreach($matches[0] as $value){
$value = str_replace('@','',$value);
$sql->execute(
array(
'username' => $value
)
);
if($sql->rowCount() > 0){
$user = $sql->fetchObject();
$text = str_replace($value,'[:'.$user->id.']',$text);
}
}
return($text);
}
这是从我的数据库中抓取数据的反向函数:
public function replaceUserids($text){
$pattern = '/(@\[:[0-9]+\])/';
preg_match_all($pattern, $text, $matches);
$sql = $this->db->prepare("
SELECT `username`
FROM `users` u
WHERE `id` = :id LIMIT 1
");
foreach($matches[0] as $value){
preg_match('/[0-9]/',$value, $match);
$id = $match[0];
$sql->execute(
array(
'id' => $id
)
);
if($sql->rowCount() > 0){
$user = $sql->fetchObject();
$text = str_replace($value, '@'.$user->username,$text);
}
}
return($text);
}
答案 2 :(得分:-1)
您是否尝试过使用preg_match_all?