2012-09-29 13 views
5

Przetwarzam dokument i chciałbym podzielić go za pomocą preg_split() php.Regex na ciąg znaków między dwoma symbolami, ale nie trzema z tego symbolu

Dokument jest podzielony na sekcje z pozycjami:

==Section Title== 

Problemem jest to, że każda sekcja posiada podsekcje z pozycjami:

===Subsection Title=== 

pytanie: Czy istnieje sposób, aby użyć wyrażenia regularnego do przeanalizować dokument pod kątem rzeczy, które są pomiędzy dwoma równymi znakami, ale nie pomiędzy trzema równymi znakami?

Dzięki!

P.S. Próbuję nauczyć się regex, ale nadal uważam, że jest to dość mylące!

Odpowiedz

6

Oto jeden, który powinien działać:

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

Jak to działa:

Wzór (?<!=)==(?!=) pojawia się dwukrotnie (początek i koniec). Pasuje do dwóch znaków równości, które nie są poprzedzone lub są oznaczone innym znakiem równości przy użyciu (?<!=) (ujemny lookbehind) i (?!=) (ujemny lookahead). Celem tego jest upewnienie się, że przypadkowo nie pasujesz do dwóch znaków równości, które są częścią większej grupy, takiej jak ===.

W środku (.*) dopasowuje dowolny tekst między dwiema parami: ==.

+0

myślę, że trzeba '^' i '$' wokół niego. W przeciwnym razie po prostu dopasuje część drugiego wiersza do drugiego znaku (. * Spowoduje przejście do pierwszego z 3 znaków = po prawej). – Barmar

+0

Dzięki! Musiałem uciec przed negatywnym uprzedzeniem, ale potem wydaje się, że działa. – OneThreeSeven

+0

@Barmar: Bardzo dobrze, przerobiłem wyrażenie regularne tak, aby nie miało tego problemu. Dzięki za uwagę. – Jon

3

Nie jestem pewien, czy martwisz się tymi nagłówkami, czy analizujesz całą WikiCreole, ale biblioteki są dostępne do parsowania WikiCreole w PHP.

http://wiki.wikicreole.org/Libraries

+0

To zabawne, skąd wiesz, co próbuję zrobić =) – OneThreeSeven

+0

Czy możesz pokazać przykład, jak to zrobić z biblioteką? –

+0

@ BenLee, Przepraszam, ale nie mogę. Nigdy tego nie używałem. – Brad

1

Zakładając, że nie ma żadnych białe znaki na początku/końca linii:

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

Upewnij się również, że ustawiłeś tryb multilinii: ''/ ^== [^ =] + ==/m'' –

Powiązane problemy