正则表达式捕获多个语句

时间:2015-03-11 12:29:17

标签: php regex

所以我正在处理一个项目,我正在将@misterFoo转换为@[:1234](他的用户ID)。

这一切都有效,我很高兴,但我也想恢复这个。

我已经找出了捕获@[:1234]的正则表达式,但是当这个字符串中出现第二次出现时:

"Joo @[:1234] my buddy @[:5678] want's his money back"

我的正则表达式只能获得@[:1234] /(@\[:[0-9]])/我可能错过了+这样的多个单词或数字边界,或\b有人可以解释我需要的内容吗?

有人在这个正则表达式的评论中给出了正确的答案: https://regex101.com/r/lL9lB4/1

现在我遇到了如何从1234

中获取@[:1234]的麻烦

3 个答案:

答案 0 :(得分:0)

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

@\[:([0-9]+)\]

从组索引1中获取所需的字符串。

DEMO

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

DEMO

$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