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.

0
elegant-user 18 ene. 2018 a las 14:20

3 respuestas

La mejor respuesta

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

1
Edwin 18 ene. 2018 a las 11:41

Puede usar esta expresión regular con 3 grupos capturados:

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

Demo de RegEx

Explicación de RegEx:

  • @: coincide con el literal @
  • \[: coincide con el literal [
  • (\d+): unir 1+ dígitos y capturarlo en el grupo # 1 para id
  • :: coincide con el literal :
  • (\S+): unir 1+ caracteres que no sean espacios en blanco y capturarlos en el grupo # 2 para firstName
  • \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 para lastName
  • \h*: coincide con 0 o más espacios en blanco horizontales
  • \]: coincide con el literal ]
1
anubhava 18 ene. 2018 a las 11:25

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 (@\[.+?]).

1
KillerX 18 ene. 2018 a las 11:27