Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

321
Vistas
RegExp en PHP. Obtener texto entre paréntesis de primer nivel

Tengo dos tipos de cadenas en un texto:

a(bc)de(fg)h

a(bcd(ef)g)h

Necesito obtener texto entre paréntesis de primer nivel. En mi ejemplo esto es:

antes de Cristo

fg

bcd(ef)g

Traté de usar la siguiente expresión regular /\((.+)\)/ con el indicador Ungreedy (U):

antes de Cristo

fg

bcd(ef

Y sin ella:

bc)de(fg

bcd(ef)g

Ambas variantes no hacen lo que necesito. Tal vez alguien sabe cómo resolver mi problema?

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Use el patrón recursivo PCRE para hacer coincidir las subcadenas entre paréntesis anidados:

 $str = "a(bc)de(fg)h some text a(bcd(ef)g)h "; preg_match_all("/\((((?>[^()]+)|(?R))*)\)/", $str, $m); print_r($m[1]);

La salida:

 Array ( [0] => bc [1] => fg [2] => bcd(ef)g )

\( ( (?>[^()]+) | (?R) )* \)

Primero coincide con un paréntesis de apertura. Luego, coincide con cualquier número de subcadenas que pueden ser una secuencia sin paréntesis o una coincidencia recursiva del patrón en sí (es decir, una subcadena correctamente entre paréntesis). Finalmente, hay un paréntesis de cierre.


Precauciones técnicas:

Si hay más de 15 paréntesis de captura en un patrón, PCRE tiene que obtener memoria adicional para almacenar datos durante una recursión, lo que hace mediante el uso de pcre_malloc, y luego lo libera a través de pcre_free. Si no se puede obtener memoria, guarda datos solo para los primeros 15 paréntesis de captura, ya que no hay forma de dar un error de falta de memoria dentro de una recursión.

about 4 years ago · Santiago Trujillo Denunciar

0

Esta pregunta tiene prácticamente la respuesta, pero las implementaciones son un poco ambiguas. Puede usar la lógica en la respuesta aceptada sin ~ s para obtener esta expresión regular:

 \(((?:\[^\(\)\]++|(?R))*)\)

Probado con esta salida:

ingrese la descripción de la imagen aquí

about 4 years ago · Santiago Trujillo Denunciar

0

Por favor puedes intentar eso:

 preg_match("/\((.+)\)/", $input_line, $output_array);

Pruebe este código en http://www.phpliveregex.com/

 Regex: \((.+)\) Input: a(bcd(eaerga(er)gaergf)g)h Output: array(2 0 => (bcd(eaerga(er)gaergf)g) 1 => bcd(eaerga(er)gaergf)g )
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda