2012-09-29 16 views
5

Estoy analizando un documento y me gustaría dividirlo usando php's preg_split().Regex para cadena entre dos de un símbolo pero no tres de ese símbolo

El documento está organizado en secciones con títulos de:

==Section Title== 

El problema es que cada sección tiene subsecciones con títulos de:

===Subsection Title=== 

Pregunta: ¿Hay una manera de utilizar expresiones regulares para analizar a través del documento para las cosas que están entre dos signos iguales, pero no entre tres signos iguales?

Gracias!

P.S. Estoy tratando de aprender regex, ¡pero aún así lo encuentro bastante confuso!

Respuesta

6

Aquí hay uno que debería funcionar:

(?<!=)==(?!=)(.*)(?<!=)==(?!=) 

Cómo funciona:

El patrón (?<!=)==(?!=) aparece dos veces (principio y fin). Coincide con dos signos iguales que no están precedidos o seguidos por otro signo igual usando (?<!=) (lookbehind negativo) y (?!=) (lookahead negativo). El objetivo de esto es garantizar que no coincida accidentalmente con dos signos iguales que forman parte de un grupo más grande, como ===.

El (.*) en el medio coincide con el texto que existe entre los dos pares de ==.

+0

creo que es necesario '^' y '' $ alrededor de ella. De lo contrario, simplemente coincidirá con la parte de la segunda línea del segundo carácter (. * Engullirá el primero de los 3 '=' caracteres a la derecha). – Barmar

+0

¡Gracias! Tuve que escapar del = en los negativos lookaheads, pero después de eso parece funcionar. – OneThreeSeven

+0

@Barmar: Muy cierto, he reelaborado la expresión regular para que no tenga este problema. Gracias por notarlo. – Jon

3

No estoy seguro si solo te preocupan esos encabezados, o si analizas todo WikiCreole, pero hay bibliotecas disponibles para analizar WikiCreole en PHP.

http://wiki.wikicreole.org/Libraries

+0

es curioso cómo sabes lo que estoy tratando de hacer =) – OneThreeSeven

+0

¿Puedes mostrar un ejemplo de cómo harías esto con una biblioteca? –

+0

@BenLee, lo siento, pero no puedo. Nunca lo he usado yo mismo. – Brad

1

Suponiendo que no hay ningún espacio en blanco en el inicio/final de la línea:

^==[^=]+==$ 
+0

Asegúrese de especificar el modo multilínea también: ''/^== [^ =] + ==/m'' –

Cuestiones relacionadas