2015-03-11 5 views
-2

, поэтому я работаю над проектом, и я конвертирую @misterFoo в @[:1234] (его идентификатор пользователя).regex захватывает несколько заявлений

Все это работает, и я счастлив, но я также хочу вернуть это.

Я уже понял, регулярное выражение, чтобы захватить @[:1234], но когда есть второе появление, как в этой строке:

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

я могу получить только @[:1234] с моим регулярным выражением /(@\[:[0-9]])/ Я, вероятно, отсутствует мультипликатор слова или цифры, такие как + или \b Может кто-нибудь объяснить, что мне нужно?

кто-то дал правильный ответ в комментариях, который был в этом регулярное выражение: https://regex101.com/r/lL9lB4/1

теперь я обращенную неприятности, как я могу получить 1234 из @[:1234]

+0

Какой двигатель вы используете? Должна быть замена команды глобального типа. –

+1

Проверьте, поддерживает ли ваш двигатель флаг 'g' (global). '/ .../g' –

+1

Проверьте это. https://regex101.com/r/lL9lB4/1 –

ответ

0

Это фиксируется здесь функции, которые я сделал, чтобы решить:

это функция, которая преобразует имена пользователей в строке в @ [: идентификатор] для базы данных

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

И это обратное функция для захвата данных из моего db:

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

Просто поместите шаблон, который соответствует цифрам внутри группы захвата.

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

Grab строка, которую вы хотите от индекса группы 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); 
+0

опубликовать причину downvote. –

Смежные вопросы