Necesito extraer todas las "palabras" separadas por espacios en blanco al final de la cadena que comienzan con el carácter @ o que consisten únicamente en dígitos.
Por ejemplo, tengo esta cadena:
hello @tag1 111 world @tag2 @tag3 222 333necesito obtener
@tag2 @tag3 222 333He usado este código a continuación:
preg_match_all('~\B@\S+|\b\d+\b~', $string, $match); Con esto, obtendré todas las cadenas que comenzaron con el carácter y los números '@', incluso @tag1 y 111 .
También probé el siguiente código:
$str = 'hello @tag1 111 world @tag2 @tag3 222 333'; $exp = explode(' ', $str); $arraysfordelete = []; foreach ($exp as $num => $user) { if (!preg_match('~\B@\S+|\b\d+\b~', $user, $match)) { array_push($arraysfordelete, $num); } } $array = array_slice($exp, end($arraysfordelete) + 1); echo implode(' ', $array);¿Alguna sugerencia?
Aquí está la solución PHP que necesita:
$str = 'hello @tag1 111 world @tag2 @tag3 222 333'; if (preg_match('~(?<!\S)(@\S+|\d+)(?:\s+(?1))*(?=\s*$)~', $str, $m)) { echo $m[0]; } // => @tag2 @tag3 222 333Vea la demostración de expresiones regulares . Detalles :
(?<!\S) - una ubicación que está justo después de un espacio en blanco o al comienzo de una cadena(@\S+|\d+) - Grupo 1: @ y uno o más caracteres sin espacios en blanco o uno o más dígitos(?:\s+(?1))* - cero o más ocurrencias de uno o más espacios en blanco y luego el patrón del Grupo 1(?=\s*$) - inmediatamente a la derecha, debe haber cero o más espacios en blanco y el final de la cadena.Podrías usar, por ejemplo
~[@\d]\S+~ lo que significa hacer coincidir una @ o un dígito, seguido de uno o más caracteres que no sean espacios \S+ .
O
~(?<!\S)[@\d]\S+~ si desea asegurarse de que no haya ningún carácter que no sea un espacio antes de la @ o el dígito.