Pokaż wyniki 1 do 6 z 6

Temat: wyrażenia regularne bebekod

  1. #1
    Zarejestrowany
    Jan 2007
    Skąd
    somewhere in time
    Postów
    510

    Domyślnie wyrażenia regularne bebekod

    Kod php:
    <?php
    $string 
    "normalne [i]kursywa [/i] normalna [b]pogrubiona[/b] normalna ";
    $pattern="#\[b](.*)\[/b]|\[i](.*)\[/i]#";
    $replacement="<b>\\1</b><i>\\2</i>";
    echo 
    preg_replace($pattern,$replacement,$string);

    $string="[i][b] powinna być kursywa i pogrubiona [/b][/i][b][/b]";
    echo 
    "</br>".preg_replace($pattern,$replacement,$string);

    ?>
    chyba nie trzeba tłumaczyć, poprostu ten drugi przyklad nie działa . zamienia tylko i <i> oraz na </i> a [b] już nie rusza niewiem czemu.....
    proszę o pomoc

    oprocz tych ostatnich znaczkow [PHP oraz [/PHP] bo vbuleetin samo je dodało
    Ostatnio edytowane przez ironwall : 05-21-2008 - 17:57

  2. #2
    Avatar gogulas
    gogulas jest offline killboy powerhead
    Zarejestrowany
    Sep 2007
    Skąd
    Tu
    Postów
    1,236

  3. #3
    Zarejestrowany
    Nov 2007
    Postów
    54

    Domyślnie

    Drugi łańcuch nie działa ponieważ sprawdzanie jest wykonywane tylko 1 raz (w sensie, że przeszukuje jednokrotnie od początku do końca), a powinno być wykonywane rekurencyjnie. Ponieważ u Ciebie pierwszy znacznik [ b ] zawiera się w [ i ], w zmiennej \\2 zawarte jest wszystko co się znajduje pomiędzy znacznikami [ i ] i [ /i ], łącznie z [ b ] oraz [ /b ]. Następnie wyrażenie napotyka kolejny ciąg pasujący do wzorca czyli drugi znacznik [ b ], i też go zamienia. Więc na wyjściu jest sformatowany łańcuch bez pierwszego znacznika [ b ].
    Teraz jeżeli użyjesz jeszcze raz funkcję preg_replace(), tylko z łańcuchem otrzymanym po poprzednim formatowaniu, na przykład tak:

    Kod:
    preg_replace($pattern,$replacement,preg_replace($pattern,$replacement,$string));
    powinnieneś dostać już poprawny wynik.

    Jednak aby lepiej zoptymalizować ten proces proponowałbym zmienić zarówno wzorzec, jak i to, na co będziemy zamieniać, przykładowo w taki sposób:

    Kod:
    $pattern="#\[([bi])](.*?)\[/\\1]#";
    $replacement="<\\1>\\2</\\1>";
    Natomiast samą zamianę zrobić w podobny sposób do tego:

    Kod:
    do {
      $string = preg_replace($pattern,$replacement,$string,-1,$c);
    } while ($c != 0);
    Tak na marginesie, to wydaje mi się, że w Perlu jakoś prościej to się robi.

    A swoją drogą to nie lepiej byłoby gdyby zamieniać same znaczniki, na przykład w taki sposób:

    Kod:
    $pattern="#\[(/)?([bi])]#";
    $replacement="<\\1\\2>";

  4. #4
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Kod:
    #!/usr/bin/perl
    $string = "normalne kursywa  normalna pogrubiona normalna";
    print "IN: $string\n";
    $string =~ s/\[(.?)b\]/[$1i]/ig;
    print "OUT: $string\n";
    no i dziala...

    Kod:
    $ ./t.pl 
    IN: normalne kursywa  normalna pogrubiona normalna
    OUT: normalne kursywa  normalna pogrubiona normalna
    EDIT: na prawde podoba mi sie ze vbulletin interpretuje kod zrodlowy ktory powinien byc traktowany doslownie jako cytat :P
    Ostatnio edytowane przez TQM : 05-22-2008 - 10:29
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  5. #5
    Zarejestrowany
    Jan 2007
    Skąd
    somewhere in time
    Postów
    510

    Domyślnie

    @coefficient gracja merci thank you, danke shón
    Kod php:
    <?php
    $string
    ="[b]sdfsddfd[/b][i]sdfsdf[/i][u]sfsdf[/u][u][i][b]sdfsdf[/b][/i][/u][i][b][/b][/i][b][/b]";
    $pattern="#\[([biu])](.*?)\[/\\1]#";
    $replacement="<\\1>\\2</\\1>";
    do{
        
    $string=preg_replace($pattern,$replacement,$string,-1,$c);
        }while(
    $c!=0);
    echo 
    $string;
    ?>

    mam tylko jedną sprawę...co znaczy zmienna $c ?
    oznacza ona ile zrobiono tych "zmian" w wyrażeniu tak? dobrze myśle?
    Ostatnio edytowane przez ironwall : 05-22-2008 - 14:08

  6. #6
    Zarejestrowany
    Nov 2007
    Postów
    54

    Domyślnie

    Cytat Napisał ironwall Zobacz post
    mam tylko jedną sprawę...co znaczy zmienna $c ?
    oznacza ona ile zrobiono tych "zmian" w wyrażeniu tak? dobrze myśle?
    Tak. Funkcja preg_replace() przypisuje do zmiennej $c liczbę zamienionych wyrażeń.

Podobne wątki

  1. Odpowiedzi: 18
    Autor: 07-14-2009, 11:55

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj