Регулярное выражение для извлечения всех @ упомянутых пользовательских данных из строки в PHP

У меня ниже строки. Эта строка содержит данные (@[ID:username__FULLNAME]) трех упомянутых пользователей. Я хочу извлечь их. Я пробовал приведенный ниже код, но не получил желаемых результатов.

ID is integer type
username and FULLNAME may contain numbers, letter and all kind of special chars.


$t = 'Hi @[4232:mark__MΛRK ATTLEY] how are you ? 
    Hi @[4232:ryan__RYΛN вυηту] how are you ? 
    Hi @[4232:david__DΛVID शाहिद ] how are you ? 
    ';

Мой код PHP:

$pattern = "|(?:(@\[[0-9]+:[\s\S(?!\])]+\]*))|";
preg_match_all($pattern, $string, $mentionList, PREG_PATTERN_ORDER);
print_r($mentionList);

Текущий результат:

Array
(
    [0] => Array
        (
            [0] => @[4232:mark__MΛRK ATTLEY] how are you ? 
    Hi @[4232:ryan__RYΛN вυηту] how are you ? 
    Hi @[4232:david__DΛVID शाहिद] how are you ? 

        )

    [1] => Array
        (
            [0] => @[4232:mark__MΛRK ATTLEY] how are you ? 
    Hi @[4232:ryan__RYΛN вυηту] how are you ? 
    Hi @[4232:david__DΛVID शाहिद] how are you ? 

        )

)

Ожидаемый результат:

Array
(
    [0] => Array
        (
            [0] => @[4232:mark__MΛRK ATTLEY]
            [1] => @[4232:ryan__RYΛN вυηту]
            [2] => @[4232:david__DΛVID शाहिद ]
        )

)

Может ли кто-нибудь помочь мне получить желаемые результаты?

Благодарю.

3 ответа

Решение

Вы можете использовать следующее регулярное выражение: @\[.+\] ( демо), которая получает все, что у вас есть в [] плюс фронт @,

Проверьте это рабочее PHP демо

Вы можете использовать это регулярное выражение с 3 захваченными группами:

/@\[(\d+):(\S+)\h+(\S+)\h*\]/

RegEx Demo

RegEx Объяснение:

  • @: Совпадать с литералом @
  • \[: Совпадать с литералом [
  • (\d+): Сопоставьте цифры 1+ и захватите их в группе № 1 для id
  • :: Совпадать с литералом :
  • (\S+): Совпадение 1+ непробельных символов и захватить его в группе № 2 для firstName
  • \h+: Сопоставьте 1 или несколько горизонтальных пробелов
  • (\S+): Совпадение 1+ непробельных символов и захватить его в группе № 3 для lastName
  • \h*: Сопоставьте 0 или более горизонтальных пробелов
  • \]: Совпадать с литералом ]

Не уверен, даст ли это именно тот результат, который вы ищете, но ваше регулярное выражение слишком жадное. Вы можете упростить это так: (?:@\[[0-9]+.+?])

Это должно вернуть захваченные группы отдельно.

Не уверен, что нужна анонимная группа захвата, чтобы ее можно было упростить до (@\[[0-9]+.+?]) или, возможно, даже (@\[.+?]),

Другие вопросы по тегам