Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: str_replace => preg_match
Forum PHP.pl > Forum > PHP
borec
jako ze jestem zielony w wyrazeniach regularnych a nie udalo mi sie znalezc przyjaznego kursu prosze o pomoc z poprawa funkcji podmieniajacej znaczniki (cos w stylu bbCode) w stringu. zrobilem to na str_replace (z reszta i tak beznadziejnie ale nie chcalo mi sie poprawiac :wink:) i chcialbym to zastapic uzyciem preg_match. z gory tnx za pomoc smile.gif

[php:1:52d8ccad3a]<?php
function bbCode ($text) { // bbCode()
$text = nl2br($text);

// usuwa puste znaczniki
$text = str_replace("[ b ][/ b ]", "", $text);
// musialem dodac space zeby forum nie parsowalo
$text = str_replace("[ i ][/ i ]", "", $text);
$text = str_replace("[ u ][/ u ]", "", $text);
$text = str_replace("[img][/img]", "", $text);
$text = str_replace("", "", $text);

// zamienia znaczniki na html
$text = str_replace("[ b ]", "<b>", $text);
$text = str_replace("[/ b ]", "</b>", $text);
$text = str_replace("[ i ]", "<i>", $text);
$text = str_replace("[/ i ]", "</i>", $text);
$text = str_replace("[ u ]", "<u>", $text);
$text = str_replace("[/ u ]", "</u>", $text);
$text = str_replace("[img]", '<img src="', $text);
$text = str_replace("[/img]", '" alt="" align="left">', $text);
$text = str_replace("[url=", '<a href="', $text);
$text = str_replace("[/url]", "</a>", $text);

// zamiana kolorow
$text = str_replace("[color=", '<span style="color: ', $text);
$text = str_replace("[/color]", "</span>", $text);

// zmiana wielkosci textu
$text = str_replace("[size=", '<span style="font-size: ', $text);
$text = str_replace("[/size]", "</span>", $text);

$text = str_replace("]", '">', $text);
/* to robi najwiecej zamieszania, np.
gdy w stringu (konkretnie tresci newsa)
wystepuja nawiasy kwadratowe nie zwiazane ze znacznikami
*/

return $text;
}
?>[/php:1:52d8ccad3a]

update: chyba preg_match tongue.gif mozliwe ze preg_replace albo jeszcze jakas inna funkcja smile.gif
borec
po glebszym przemyslunku: chyba popatrze w kod phpBB tongue.gif ale nie obrazilbym sie na odpowiedz :wink:
BzikOS
Skoro udało Ci się to zrobić przy pomocy str_replace to znaczy, że nie ma potrzeby używać wyrażeń regularnych. Radziłbym Ci tylko zrobić dwie tablice - jedna zawierająca elementy zamieniane, a druga elementy na jakie ma zamienić i dopiero wrzucenie tych dwóch tablic do str_replace. Przykład:

[php:1:99850d1ae6]<?php
$tempArr1 = Array('[b]', '[u]', '[i']);
$tempArr2 = Array('<b>', '<u>', '<i>');

$str = str_replace( $tempArr1, $tempArr2, $str );
?>[/php:1:99850d1ae6]

Regexpy Ci się przydadzą wtedy, gdy będziesz miał jakieś dane wewnątrz tagu, np. [ url=http://forum.php.pl ]Forum[ /url ]
borec
Cytat
Regexpy Ci się przydadzą wtedy, gdy będziesz miał jakieś dane wewnątrz tagu, np. [ url=http://forum.php.pl ]Forum[ /url ]


wlasnie o to chodzi ze sa tongue.gif popatrz jeszcze raz na kod. z tymi tablicami wlasnie tego nie chcialo mi sie poprawiac tongue.gif to poprosze tylko ten fragment z url w regexp :wink:
BzikOS
Aż przysiadłem nad tym i zacząłem skrobać smile.gif Oto co naskrobałem:

Kod
<?php

$str = "blah [url=http://forum.php.pl]Forum[/url] [b]bold[/b] [i]italic[/i] [img]http://forum.php.pl/templates/subSilver/images/lang_polish/icon_ip.gif[/img] [color=green]zielony[/color]";



$codesArr = Array('url'  => Array('a','href="'),

      'img'  => Array('img','src="'),

      'color'    => Array('span','style="color:'),

      'b'  => 'b',

      'u'  => 'u',

      'i'  => 'i');



foreach( $codesArr as $aKey => $aVal )

    $str = preg_replace_callback( "#[($aKey)[=]?(.*)?](.*?)[/$aKey]#si", 'repl', $str );    



function repl( $matches )

{

    global $codesArr;



    if( is_array( $codesArr[$matches[1]] ) )

    {

  if( !empty( $matches[2] ) )

     $x = '<' . implode( ' ', $codesArr[$matches[1]] ) . $matches[2] . '">' . $matches[3] . '</' . $codesArr[$matches[1]][0] . '>';

  else

     $x = '<' . implode( ' ', $codesArr[$matches[1]] ) . $matches[3] . '">';

    }

    else

    {

  $x = '<' . $codesArr[$matches[1]] . '>' . $matches[3] . '</' . $codesArr[$matches[1]] . '>';

    }



    Return $x;

}





print( $str );

?>


I dziwne.. bo działa tongue.gif Nie wiem jakei jeszcze moga być możliwe BBCody, ale już mi się nie chce myśleć :/

btw. kod php celowo w innych znacznikach winksmiley.jpg
borec
8O biggrin.gif aha, dzieki tongue.gif
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.