Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

397
Visualizações
PHP - Coincidencia preg con múltiples condiciones

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?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

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+)?#"
over 4 years ago · Santiago Trujillo Relatório

0

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

over 4 years ago · Santiago Trujillo Relatório

0

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.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda