Tengo debajo de la cadena. Esta cadena tiene datos (@ [ID: username__FULLNAME]) de tres usuarios mencionados. Quiero extraerlos He intentado debajo del código pero no obtengo los resultados deseados.
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 ?
';
Mi código PHP:
$pattern = "|(?:(@\[[0-9]+:[\s\S(?!\])]+\]*))|";
preg_match_all($pattern, $string, $mentionList, PREG_PATTERN_ORDER);
print_r($mentionList);
Resultado actual:
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 ?
)
)
Resultado esperado:
Array
(
[0] => Array
(
[0] => @[4232:mark__MΛRK ATTLEY]
[1] => @[4232:ryan__RYΛN вυηту]
[2] => @[4232:david__DΛVID शाहिद ]
)
)
¿Alguien puede ayudarme a obtener los resultados deseados?
Gracias.
3 respuestas
Puede usar la siguiente expresión regular: @\[.+\]
(demo) que le ofrece todo lo que necesita tener en []
más el frente @
.
Comprueba este funcionamiento php demo
Puede usar esta expresión regular con 3 grupos capturados:
/@\[(\d+):(\S+)\h+(\S+)\h*\]/
Explicación de RegEx:
@
: coincide con el literal@
\[
: coincide con el literal[
(\d+)
: unir 1+ dígitos y capturarlo en el grupo # 1 paraid
:
: coincide con el literal:
(\S+)
: unir 1+ caracteres que no sean espacios en blanco y capturarlos en el grupo # 2 parafirstName
\h+
: unir 1 o más espacios en blanco horizontales(\S+)
: unir 1+ caracteres que no sean espacios en blanco y capturarlos en el grupo # 3 paralastName
\h*
: coincide con 0 o más espacios en blanco horizontales\]
: coincide con el literal]
No estoy seguro de si esto le dará el resultado exacto que está buscando, pero su expresión regular es demasiado codiciosa. Puede simplificarlo así: (?:@\[[0-9]+.+?])
Esto debería devolver los grupos capturados por separado.
No estoy seguro de si se necesita el grupo de captura anónimo, por lo que podría simplificarse a (@\[[0-9]+.+?])
o posiblemente incluso (@\[.+?])
.
Preguntas relacionadas
Nuevas preguntas
php
PHP es un lenguaje de secuencias de comandos interpretado, dinámico, orientado a objetos y ampliamente utilizado, diseñado principalmente para el desarrollo web del lado del servidor. Se utiliza para preguntas sobre el lenguaje PHP.