Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyrażenia regularne - preg_replace
Rzepa
post
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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
BzikOS
post
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;
?>

questionmark.gif

BBCode celowo wyłączone.
Go to the top of the page
+Quote Post
Rzepa
post
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...

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!!
Go to the top of the page
+Quote Post
BzikOS
post
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.
Go to the top of the page
+Quote Post
Rzepa
post
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!!
Go to the top of the page
+Quote Post
FiDO
post
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 :/
Go to the top of the page
+Quote Post
Rzepa
post
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.
Go to the top of the page
+Quote Post
FiDO
post
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 :/
Go to the top of the page
+Quote Post
Rzepa
post
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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 05:00