Регулярное выражение для извлечения всех @ упомянутых пользовательских данных из строки в 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 ответа
Решение
Вы можете использовать это регулярное выражение с 3 захваченными группами:
/@\[(\d+):(\S+)\h+(\S+)\h*\]/
RegEx Объяснение:
@
: Совпадать с литералом@
\[
: Совпадать с литералом[
(\d+)
: Сопоставьте цифры 1+ и захватите их в группе № 1 дляid
:
: Совпадать с литералом:
(\S+)
: Совпадение 1+ непробельных символов и захватить его в группе № 2 дляfirstName
\h+
: Сопоставьте 1 или несколько горизонтальных пробелов(\S+)
: Совпадение 1+ непробельных символов и захватить его в группе № 3 дляlastName
\h*
: Сопоставьте 0 или более горизонтальных пробелов\]
: Совпадать с литералом]
Не уверен, даст ли это именно тот результат, который вы ищете, но ваше регулярное выражение слишком жадное. Вы можете упростить это так: (?:@\[[0-9]+.+?])
Это должно вернуть захваченные группы отдельно.
Не уверен, что нужна анонимная группа захвата, чтобы ее можно было упростить до (@\[[0-9]+.+?])
или, возможно, даже (@\[.+?])
,