![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 13.01.2004 Ostrzeżenie: (0%) ![]() ![]() |
Potrzebna mi funkcja zamieniająca PARY odpowiednich znaczników na inne. Chodzi mi konkretnie o zamianę pary [#b] i [#/b] (bez '#') na odpowiedniki html'owe.
Kod uproszczony: [php:1:a3ac445b34]<?php $search = array ( "'[s*bs*](.*)[s*/s*bs*]'i" ); $replace = array ( "<b>1</b>" ); preg_replace($search, $replace, $string); ?>[/php:1:a3ac445b34] Wszystko działa ok, do czasu, gdy w zmiennej $string nie będzie dwóch par znaczników [#b]. Wtedy znajdzie parę pierwszy-ostatni, a te w środku zostawi. Tak więc problem można streścić: Jak zbudować wzorzec pasujący do ciągu w którym NIE wystąpi inny wzorzec? |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 660 Pomógł: 0 Dołączył: 28.08.2002 Skąd: Starachowice Ostrzeżenie: (0%) ![]() ![]() |
yyy czy o to chodzi:
<?php $string = "fsdfsdfsd sdfdf "; $replArr = Array ( "b", "u", "i" ); foreach( $replArr as $aVal ) $string = preg_replace("/[$aVal](.*?)[/$aVal]/is", "<$aVal>1</$aVal>", $string); echo $string; ?> ![]() BBCode celowo wyłączone. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 13.01.2004 Ostrzeżenie: (0%) ![]() ![]() |
nie próbowałem Twojego kodu, ale to raczej nie o to chodzi, bo jeśli damy na wejście:
"grubo text grubo", to ta funkcja podmieni tylko pierwszy i ostatni znacznik, a zostawi to co w środku, czyli: "<b>grubo[/b] text grubo</b>", czyli nie to, co byśmy chcieli... ![]() Tam gdzie we wzorcu występuje (.*?) trzeba wstawić coś, co pasowałoby do ciągu nie zawierającego znacznika zamykającego . W wyrażeniach regularnych można zaprzeczać pojedyncze znaki (np. [^d]), ale jak zaprzeczyć podwyrażenie?? help!! |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 660 Pomógł: 0 Dołączył: 28.08.2002 Skąd: Starachowice Ostrzeżenie: (0%) ![]() ![]() |
Cytat nie próbowałem Twojego kodu, ale to raczej nie o to chodzi
To spróbuj. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 13.01.2004 Ostrzeżenie: (0%) ![]() ![]() |
Faktycznie, działa - super! Dzięki!
Tylko jeszcze jedna prośba: Wytłumacz proszę, czym w takim razie różni się zapis (.*?) od (.*), oraz co w tym wypadku daje opcja 's', bo sądziłem do tej pory, że powoduje ona jedynie ignorowanie znaków końca linii... Jeszcze raz dzięki!! |
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Cytat Faktycznie, działa - super! Dzięki!
Tylko jeszcze jedna prośba: Wytłumacz proszę, czym w takim razie różni się zapis (.*?) od (.*), oraz co w tym wypadku daje opcja 's', bo sądziłem do tej pory, że powoduje ona jedynie ignorowanie znaków końca linii... Jeszcze raz dzięki!! .*? powoduje to samo co przelacznik U, czyli niezachlanne dopasowywanie tekstu, np. Kod [b]jakis tekst[/b] [b]inny tekst[/b]
Wersja zachlanna (.*) wylapie calego stringa, a niezachlanna tylko pierwszy tekst. Opcja s powoduje, ze znaki konca linii tez sa wylapywane przez kropke w wyrazeniach regularnych (domyslnie kropka nie wylapuje tego znaku), co w tym wypadku powoduje, ze zostana tez dopasowane tagi, ktore koncza sie w innej linii niz sie zaczynaja. -------------------- Brak czasu :/
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 13.01.2004 Ostrzeżenie: (0%) ![]() ![]() |
ok, tylko gdziekolwiek bym nie patrzył w specyfikacjach, to ? oznacza conajmniej raz, najmniejszej niepodzielnej części wzorca przed tym znakiem. W zw. z tym nie rozumiem dlaczego to działa tak jak to opisałeś, ale działa.
Czy zna ktoś jakiś dobry manual dot. wyrażeń regularnych, gdzie byłaby o tym mowa? pozdr. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Cytat ok, tylko gdziekolwiek bym nie patrzył w specyfikacjach, to ? oznacza conajmniej raz, najmniejszej niepodzielnej części wzorca przed tym znakiem. W zw. z tym nie rozumiem dlaczego to działa tak jak to opisałeś, ale działa.
Nie oznacza conajmniej raz, tylko 0 albo 1 razy... W przypadku (.*?) znaczenie znaku zapytania jest specjalne, takie wlasnie jak opisalem. Cytat Czy zna ktoś jakiś dobry manual dot. wyrażeń regularnych, gdzie byłaby o tym mowa?
IMHO w manualu do php jest swietny opis wyrazen.. encyklopedcyczny ale z przykladami i jasnym jezykiem. -------------------- Brak czasu :/
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 13.01.2004 Ostrzeżenie: (0%) ![]() ![]() |
dzięki. szukałem tam, tylko nie w tej sekcji, gdzie trzeba.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 05:00 |