Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne - preg_replace
Forum PHP.pl > Forum > PHP
Rzepa
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?
BzikOS
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;
?>

questionmark.gif

BBCode celowo wyłączone.
Rzepa
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...

sad.gif

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!!
BzikOS
Cytat
nie próbowałem Twojego kodu, ale to raczej nie o to chodzi


To spróbuj.
Rzepa
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!!
FiDO
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.
Rzepa
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.
FiDO
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.
Rzepa
dzięki. szukałem tam, tylko nie w tej sekcji, gdzie trzeba.
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.