Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] wyrażnie regularne
Forum PHP.pl > Forum > Przedszkole
b_chmura
Witam
mam kolejny (zapewne drobny problem) usiłuje zrobić coś w sposób BBCode jednak napotkałem na pewien problem...
stworzyłem sobie takie wyrażenie:
  1. <?php
  2. $co = preg_replace("/(.+n?)/", "<b>1</b>", $co);
  3. ?>

jego celem jest pogrubienie wszystkich znaków znajdujących się pomiędzy [ b ][ /b ].
Kiedy w tekście tylko raz użyjemy [ b ][ /b ] wszystko jest w porządku:
Cytat
tekst tekst [ b ]tekst[ /b ] tekst tekst tekst tekst

Pokaże nam:
Cytat
tekst tekst tekst tekst tekst tekst tekst


Jednak gdy w tekście użyjemy dwa lub więcej razy znaczników [ b ][ /b ]:
Cytat
tekst tekst [ b ]tekst[ /b ] tekst tekst tekst [ b ]tekst[ /b ] tekst

Robi na się bałagan w postaci:
Cytat
tekst tekst tekst[ /b ] tekst tekst tekst [ b ]tekst tekst


jak rozwiązać taki problem?
adam187
Nawiasy klamrowe w tym przypadku złoża do grupowania a nie oznaczenie znaku.

Polecam
http://www.english.uga.edu/humcomp/perl/regexps.html

Robione na szybko bez sprawdzania więc nie wiem czy działa

  1. <?php
  2. $co = preg_replace("|([^[]*)|", "<b>1</b>", $co);
  3. ?>
b_chmura
dzięki wielkie, udało Ci się rozwiązać ten problem
Kicok
Skoro uważasz, że udało się rozwiązać problem, to sprawdź czy pogrubi ten tekst:

Kod
asd asd asd [b] asd asd asd [ asd asd asd [/b] asd asd asd



Twoje pierwsze wyrażenie jest dobre, tylko wytłumacz mi, co robi tam to "n"? :]
b_chmura
Cytat
Twoje pierwsze wyrażenie jest dobre

Nie jest dobry ponieważ zachowuje się tak jak poprzednio napisałem sad.gif

[quote]tylko wytłumacz mi, co robi tam to "n"? :]
Powinno być \n? ale forum zjadło bakslesza

EDIT
i co do
Kod
asd asd asd [b] asd asd asd [ asd asd asd [/b] asd asd asd

masz racje, psuje cały efekt
webdice
Panowie, to są podstawy,

Kod
<?php

$co = 'jakis tekst [b] to ma byc [ pogrubione [b] tu jeszcze cos, tez porgubione [/b] a to juz nie';

print preg_replace('#\[b\](.*)\[/b\]#', '<b>\\1</b>', $co);

?>


Kod dałem w znacznikach code, ponieważ php usuwał slashe.
b_chmura
Cytat(webdicepl @ 4.07.2007, 18:35:36 ) *
Panowie, to są podstawy,

Kod
<?php

$co = 'jakis tekst [b] to ma byc [ pogrubione [b] tu jeszcze cos, tez porgubione [/b] a to juz nie';

print preg_replace('#\[b\](.*)\[/b\]#', '<b>\\1</b>', $co);

?>


Kod dałem w znacznikach code, ponieważ php usuwał slashe.


testowałeś swój skrypt? zauważ ze on wszytko co jest pomiędzy [b ][ /b] pogrubia czyli niby w czym bedą mu przeszkadzać inne [ b][ /b]

czyli np z takim tekstem
Kod
jakis tekst [b] to ma byc [ pogrubione[/b] tutaj nie [b] tu jeszcze cos porgubione [/b] a to juz nie


zrobi

jakis tekst to ma byc [ pogrubione[ /b] tutaj nie [b ] tu jeszcze cos porgubione a to juz nie
x3m
lazy...
Kod
preg_replace('#\[b\](.*?)\[/b\]#', '<b>\\1</b>', $co);
Kicok
Jeśli chcesz znaleźć wszystkie znaki (łącznie ze znakami nowej linii) między [ b] a [ /b] to dodajesz do wyrażenia flagę: s (http://pl.php.net/manual/en/reference.pcre.pattern.modifiers.php )

Cytat
preg_replace( '#\\[b\\](.*?)\\[/b\\]#si', '<b>\\1</b>', $tekst );
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.