Tengo la siguiente cadena:
"#(admin/pages|admin/pages/add|admin/pages/[0-9]+)#"Y esta cadena para compararla con:
"admin/pages/1" Lo que necesito es devolver " admin/pages/1 " al comparar las 2 cadenas usando preg_match() . Tengo el siguiente código y no funciona:
if(preg_match("#(admin/pages|admin/pages/add|admin/pages/[0-9]+)#", "admin/pages/1", $matches) { var_dump($matches); }Esta es la salida que obtengo:
array(2) { [0]=> string(11) "admin/pages" [1]=> string(11) "admin/pages" }¿Alguien puede ayudar?
Cambie su expresión regular a:
"#(admin/pages(?:/\d+)?|admin/pages/add)#" No necesita ambas variantes ( admin/pages|admin/pages/[0+9]+ ) si coloca los dígitos en el primer patrón y los hace opcionales.
Los signos de interrogación y las repeticiones son codiciosos por defecto, es por eso que siempre incluirá los dígitos en la coincidencia de mi versión.
Por otro lado, si tiene una alternancia, siempre elegirá la primera coincidencia. Dado que su primera alternancia no incluye dígitos, no coinciden.
Si también te preguntas por qué obtienes tu coincidencia dos veces, es por la forma en que funciona preg_match .
Cita de la documentación:
$coincidencias[0] contendrá el texto que coincidió con el patrón completo, $coincidencias[1] tendrá el texto que coincidió con el primer subpatrón capturado entre paréntesis, y así sucesivamente.
Puede eliminar los paréntesis exteriores si la coincidencia completa es suficiente:
"#admin/pages(?:/\d+)?|admin/pages/add#" Solo usa $matches[0] .
Y, como ha escrito @RomanPerekhrest y lo incluyo descaradamente en esta respuesta, puede acortar su patrón. No necesita incluir admin/pages varias veces:
"#admin/pages(?:/add|/\d+)?#"Use el siguiente padre de expresiones regulares cortas:
"#admin/pages(/add|/[0-9]+)?#" (/add|/[0-9]+)? - grupo alternativo opcional, coincide con /add o /<number> al final de la subcadena buscada si ocurre
Intenta cambiar el orden de los componentes:
"#(admin/pages/[0-9]+|admin/pages/add|admin/pages)#" La expresión regular se cumple tan pronto como algo coincide. En su caso, se detuvo tan pronto como encontró admin/pages sin buscar más.