Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [regexp] Jak znalezc dany tag <tpl:if()></tpl>
Forum PHP.pl > Forum > PHP
deirathe
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Untitled Document</title>
  5. </head>
  6. <tpl:
  7. <tpl:$zmienna />
  8. <b>moj <tpl:$zmien$na2 /> tekst</b>
  9. <tpl:if($data)>
  10. asasa
  11. <tpl:else>
  12. aaaa
  13. </tpl>
  14. <tpl:$data/>
  15. <asasas />
  16. <tpl:$data<a>/>
  17. <tpl drugi tekst w tpl></tpl>
  18. </body>
  19. </html>

Mam sobie taki html, może mi ktoś pomóc bo nie wiem jak wyciągnąć z tego cały blok if znajdujący się w tagach <tpl:if></tpl>, próbowałem czegoś takiego:
<tpl:if(.*)>(.|\n)*</tpl>
ale mi nie bardzo działało ;/
grzesiek_g
A to dziwne, bo mi plugin QuickREx do Eclipse pokazuje, że to wyrażenie jest poprawne i w przykładowym szablonie html wynajduje wystąpienie tego.
deirathe
kurcze, tez tak myslalem ale mi nie dziala sad.gif ja mam EditPad

fakt sprawdziłem w php i działa ale nie do końca tak jakbym sobie tego życzył. Jak zrobić żeby kończył na pierwszym wystąpieniu </tpl> a nie na kolejnym z rzędu?
grzesiek_g
Spróbuj tego:
Kod
\<tpl:if(.*)\>(.|\n)*\<\/tpl\>

Rzeczywiście, nie działa jak znacznik </tpl> wystąpi jeszcze dalej.

Można zrobić tak by w (.|\n) dodać można było negację podwyrażnia (</tpl>). Niestety nic mi w tej chwili nie przychodzi do głowy jak to zapisać.
deirathe
dzięki, może jeszcze coś wymyślę... bo na forum rzadko kto mi odpisuje.
templar
  1. <?php
  2. $text = str_replace("r\n", '[n]', $text);
  3.  
  4. preg_match_all("/<tpl:if(.*)>(.*)</tpl>/", $text, $matches);
  5.  
  6. // print_r($matches);
  7. ?>
deirathe
A w czym ma mi to pomóc?? Ja nie mam problemów z nowymi liniami tylko z tym że pobiera za dużo zamykających tagów, a powinien tylko jeden...
Kicok
Po pierwsze dodaj sobie do wyrażenia flagę s, żeby kropka dopasowywała się także do znaków nowej linii (\n i \r). Teraz nie będziesz już musiał używać alternacji w: "(.|\n)*"

Po drugie gwiazdka za okrągłym nawiasem przyniesie ci nieoczekiwane rezultaty

Po trzecie poczytaj o zachłanności w wyrażeniach regularnych: http://grabun.com/wyrazenia-regularne/zachlannosc/ -> rozwiązanie drugie
deirathe
dzięki, przyda się, jak masz jeszcze coś ciekawego o regexp to z chęcią wciągnę smile.gif
Kocurro
Zamiast:

<tpl:if(.*)>(.|\n)*</tpl>

Dać musisz:

|<tpl:if(.*?)>(.*?)</tpl>|is

Różnica jest następująca:

- zamiast * wybiera jak największy możliwy ciąg znaków
- zamiast *? wybiera jak najmniejszy możliwy ciąg znaków
deirathe
Wielkie dzięki smile.gif jesteś wielki biggrin.gif
Kocurro
smile.gif Sam się sporo z tym kiedyś namęczyłem. Polecam lekturę dokumentacji - wiele ciekawych i całkiem przyjemnych sztuczek tam można znaleźć smile.gif

pozdr.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.