Php 捕获多个语句的正则表达式

Php 捕获多个语句的正则表达式,php,regex,Php,Regex,所以我正在做一个项目,我正在把@misterFoo转换成@[:1234](他的用户ID) 这一切都是可行的,我很高兴,但我也想恢复这一点 我已经找到了捕获@[:1234]的regexp,但是当出现第二个类似于此字符串的情况时: "Joo @[:1234] my buddy @[:5678] want's his money back" 我只能用我的regexp获取@[:1234] /(@\[:[0-9]])/我可能缺少多个单词或数字边界,如+does或\b有人能解释一下我需要什么吗 有人在这个

所以我正在做一个项目,我正在把
@misterFoo
转换成
@[:1234]
(他的用户ID)

这一切都是可行的,我很高兴,但我也想恢复这一点

我已经找到了捕获
@[:1234]
的regexp,但是当出现第二个类似于此字符串的情况时:

"Joo @[:1234] my buddy @[:5678] want's his money back"
我只能用我的regexp获取
@[:1234]
/(@\[:[0-9]])/
我可能缺少多个单词或数字边界,如
+
does或
\b
有人能解释一下我需要什么吗

有人在这个正则表达式的评论中给出了正确的答案:


现在我面临的问题是如何从
@[:1234]

中获取
1234
您是否尝试过使用?

只需将匹配数字的模式放入捕获组中即可

@\[:([0-9]+)\]
从组索引1中获取所需的字符串

@\[:\K[0-9]+(?=\])


它是固定的,下面是我用来解决它的函数:

此函数用于将字符串中的用户名转换为数据库的@[: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);
}

你用的是哪种发动机?应该有替换全局类型命令。检查您的引擎是否支持
g
(全局)标志<代码>//g检查一下这个。我正在使用php@boristespeider,然后将其标记为这样!
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);
}