У меня ниже строки. Эта строка содержит данные (@ [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 शाहिद ]
)
)
Может ли кто-нибудь помочь мне получить желаемые результаты?
Благодарю.
Вы можете использовать следующее регулярное выражение: @\[.+\]
(демонстрация) который получает все, что у вас есть в []
плюс фронт @
,
Проверьте это работает PHP демо
Вы можете использовать это регулярное выражение с 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]+.+?])
или, возможно, даже (@\[.+?])
,