PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP - preg_replace Probleme


WarSlash
2008-03-04, 00:59:28
Ich arbeite an einem kleinem BBCode-Parser. Jedoch habe ich Schwierigkeiten
eine bestimmte Zeile für so einen Tag umzusetzen:

'<p class="zeropadding"><img src="$1"></img>',



function BBDecoder($str) {

$simple_search = array(
'/\<b\>(.*?)\<\/b\>/is',
'/\<p\class="zeropadding"\><img\="(.*?)\"><\/img\>/is', <---- FALSCH
'/\<h2\>(.*?)\<\/h2\>/is'
);

$simple_replace = array(
'$1',
'$1',
'$1'
);

$str = preg_replace ($simple_search, $simple_replace, $str);
$str = strip_tags($str);
return $str;
};

function BBEncoder($str) {
$str = strip_tags($str);
$str = nl2br($str);

$simple_search = array(
'/\[B\](.*?)\[\/B\]/is',
'/\[IMG\](.*?)\[\/IMG\]/is',
'/\[H1\](.*?)\[\/H1\]/is'
);

$simple_replace = array(
'<b>$1</b>',
'<p class="zeropadding"><img src="$1"></img>',
'<h2>$1</h2>'
);

$str = preg_replace ($simple_search, $simple_replace, $str);

return $str;
};

Sephiroth
2008-03-04, 01:33:44
dein regulärer Ausdruck ist doch ganz simpel

'<p class="zeropadding"><img src="(.*)"><\/img>'

Die spitzen Klammern oder " musst du nicht escapen, genauso wie .*? Blödsinn ist, weil * schon für "0 oder beliebig oft" steht und das ? für "0 oder ein Mal".

BBCode mit regex parsen ... wenn es nur so einfach wäre.

p.s.
Dein Ausdruck '/<b>(.*)<\/b>/is' ist (stellvertretend für die anderen) zu ungenau (zu gierig). Der würde "<b>fett1<b>fett2></b>fett1.1</b>" zu "fett1<b>fett2></b>fett1.1" machen, weil er bis zum letzten schließenden Tag matcht.

WarSlash
2008-03-04, 02:07:53
Warning: preg_replace(): Unknown modifier '<' in /usr/local/httpd/htdocs/xxxx/xxxx/content/_nwssysfunctions.php on line 19

wenn ich '<p class="zeropadding"><img src="(.*)"><\/img>' einfüge...

--> '/\<p class="zeropadding"><img src="(.*)">/is', läuft !! Geht irgendwie nur mit Escape