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);
}