2013-05-30 10 views
5

W jaki sposób mogę wyreolować dopasować wszystko, co jest pomiędzy dwoma ciągami? Rzeczy między dwoma łańcuchami rozciągają się na kilka linii i mogą zawierać również wszystkie znaki html.Regex pasuje do wszystkiego między dwoma ciągami, obejmując multilinię

Na przykład:

<p>something</p> 

<!-- OPTIONAL --> 

<p class="sdf"> some text</p> 
<p> some other text</p> 

<!-- OPTIONAL END --> 

<p>The end</p> 

chcę się rozebrać cały opcjonalną część off. ale chciwi każdy mecz postać nie robi to, co chciałem .. wzór używam jest

  • <!-- OPTIONAL -->.*<!-- OPTIONAL END -->
  • <!-- OPTIONAL -->(.*)<!-- OPTIONAL END -->
  • <!-- OPTIONAL -->(.*)\s+<!-- OPTIONAL END -->
  • (?=<!-- OPTIONAL -->)(.*)\s+<!-- OPTIONAL END -->

Wszyscy dopasuj pierwszy opcjonalny tag, jeśli podana jest tylko pierwsza część, ale nie działa dobrze w przypadku kompletnych linii.

Oto przykład: http://regexr.com?352bk

Dzięki

+0

Nie należy używać wyrażeń regularnych. http://stackoverflow.com/q/1732348/34397 – SLaks

+0

jakiego języka używasz? – rednaw

+0

@SLaks czy parsery XML uwzględniają komentarze HTML? – rednaw

Odpowiedz

5

Zaznacz pole wyboru dotall w RegExr :)

Bez flagi dotall (the s w /regex/s), kropka (.) nie będzie pasował powrót karetki.

Powinieneś użyć .*? zamiast .* do leniwego dopasowania opcjonalnej treści (zobacz zdanie PLEASE DO NOT MATCH! w przykładach).

+0

Aah! Co to jest dotall i co robi? – LocustHorde

+0

@LocustHorde Edytowałem. – sp00m

+0

@LocustHorde Domyślnie znak wildcharda w regex ('.') nie pasuje do znaków nowej linii, co oznacza, że ​​wyrażenie regularne zatrzymuje wyszukiwanie na końcu wiersza. Po włączeniu dotall znak '.' będzie również zawierał znaki nowego wiersza w dopasowaniu. –

1

Włącz opcję "dotall", aby. w regex dopasuje znaki nowej linii i działa w wielu wierszach. Można to zrobić na różne sposoby, w zależności od implementacji wyrażenia regularnego, sprawdź instrukcję implementacji.

+0

Dzięki (tekst wypełniający) – LocustHorde

7

Aby ungreedy regex, użyj ? po *:

<!-- OPTIONAL -->(.*?)<!-- OPTIONAL END --> 

Czy to pomóc?

Również w zależności od używanego języka programowania masz modyfikatory, dzięki którym kropka regex (.) będzie pasować również do nowych linii. PHP masz (dotall) modyfikator s na przykład:

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

Multiline nie jest tym, czego potrzebuje OP, ale tym, który go potrzebuje. Multiline sprawi, że kotwice '^ $' będą pasowały do ​​wielu linii zamiast jednej. – sp00m

+0

Dobra, zmodyfikowałem moją odpowiedź – rednaw

+0

dziękuję! (tekst wypełniający) – LocustHorde

1

grając ze swoim przykład Myślę, że znalazłem odpowiedź, to sprawdzić w kodzie:

<!-- OPTIONAL -->[\w\W]*<!-- OPTIONAL END -->

Mam nadzieję, że ta pomoc

Powiązane problemy