I la siguiente URL https://test.example.com/blah/12345%2C80%2C8263473%2C9475834343 Después de la parte https://test.example.com/blah/ de la URL, hay números separados por %2C . Quiero obtener una matriz de todos los números en la URL. El número puede ser un 1 positivo hasta el infinito positivo. Puede haber una cantidad infinita de números en la URL o nada en absoluto (en este caso, la matriz está vacía).
En este escenario, quiero una matriz como: [12345, 80, 8263473, 9475834343]
$url = "https://test.example.com/blah/12345%2C80%2C8263473%2C9475834343"; preg_match('/\b\d+\b/', $url, $matches); print_r($matches); Sin embargo, el único elemento en mi matriz es 12345
También puede utilizar el ancla \G para obtener esos números:
(?:https?://\S+?/blah/|\G(?!^))(?:%2C)?\K\d+Explicación
(?: grupo de no capturahttps?://\S+?/blah/ coincidir el protocolo y hasta la primera aparición de /blah/| O\G(?!^) Afirmar la posición actual al final del partido anterior, no al principio) Cerrar grupo de no captura(?:%2C)? Coincide opcionalmente con %2C\K\d+ Olvidar lo que coincide hasta ahora y hacer coincidir 1+ dígitosDemostración de expresiones regulares | demostración de PHP
Ejemplo
$re = '`(?:https?://\S+?/blah/|\G(?!^))(?:%2C)?\K\d+`m'; $str = 'https://test.example.com/blah/12345%2C80%2C8263473%2C9475834343'; preg_match_all($re, $str, $matches); print_r($matches[0]);Producción
Array ( [0] => 12345 [1] => 80 [2] => 8263473 [3] => 9475834343 )Considere simplemente dividir en caracteres codificados, para generar una matriz de los números que desea
$url = "https://test.example.com/blah/12345%2C80%2C8263473%2C9475834343"; $url = preg_replace("/^.*\//", "", $url); $matches = preg_split("/%\w{2}/", $url); print_r($matches);Esto imprime:
Array ( [0] => 12345 [1] => 80 [2] => 8263473 [3] => 9475834343 )No estoy seguro de cómo funcionaría esto con PhP en un entorno de trabajo, pero ¿alguna de las siguientes sería una opción para usted?
%2C|(?!.*\/)(\d+)Donde primero haría coincidir la parte "% 2C" y usaría una alternancia para hacer coincidir grupos de dígitos después de su última barra diagonal para tomar esos grupos de dígitos en una matriz. Nuevamente, no estoy seguro de cómo obtendría una matriz de ese primer grupo de captura.
Si algo así falla, tal vez excluya la parte "% 2C" de su matriz final con verbos de control de retroceso (*SKIP)(*F) así:
%2C(*SKIP)(*F)|(?!.*\/)\d+Una posible forma alternativa de escribir esto podría ser:
(?:^.*\/|%2C)(*SKIP)(*F)|\d+