[PHP] functie str_replace lijkt niet goed z'n werk te doen

Pagina: 1
Acties:
  • 1.366 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jan_V
  • Registratie: Maart 2002
  • Laatst online: 22:19
Ik zit al een tijdje met een 'probleem' op m'n weblog.
Hier heb ik zelf een parser in gebouwd welke enkele tags zoals
code:
1
[b], [i]

en dergelijke vertaald naar een HTML equivalent.

Nu wilde ik ook gebruik maken van de code-tag.
Hier stuit ik echter op een probleem, namelijk dat deze vertaling niet goed gaat.

De vertalingen doe ik voornamelijk met de functie str_replace, aangezien het niet echt moeilijke replacements zijn. Een reguliere expressie is volgens mij een beetje overkill. Regex gebruik ik wel voor hyperlinks, maar dat is nu niet echt aan de orde.

Wanneer ik dit in m'n functie plaats
PHP:
1
2
$bodyText = str_replace( "[code]", "<div class='divCode'>", $bodyText );
$bodyText = str_replace( "[/code]", "</div>", $bodyText );

verwacht ik dat de code-tag wordt vertaald in een <div> met de bijbehorende css class.
Dit is echter niet het geval. De [code]-tag wordt vertaald in een lege string.
Ook wanneer ik de div wijzig in een <p> of een <pre> blijft deze vertaald worden naar een lege string.
De str_replace werkt dus wel een beetje, maar het lijkt alsof hij ergens midden in de functie crashed.

Het vreemde is dat wanneer ik dit doe
PHP:
1
2
$bodyText = str_replace( "[code]", "piet", $bodyText );
$bodyText = str_replace( "[/code]", "klaas", $bodyText );

dan komen namen piet en klaas tevoorschijn waar ik voorheen de code-tag had geplaatst.
Aangezien ik de str_replace precies ook zo bij andere tags gebruik lijkt het me onwaarschijnlijk dat ik iets in de syntax verkeerd heb gedaan.

Voor de volledigheid, hier de gehele replace functie
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function replacing( $text )
{
    $bodyText = str_replace( "&", "&amp;", $text );
    $bodyText = str_replace( "<", "&lt;", $bodyText );
    $bodyText = str_replace( ">", "&gt;", $bodyText );  
    $bodyText = str_replace( "\n", "<br>", $bodyText);  
    $bodyText = str_replace( "[b]", "<b>", $bodyText );
    $bodyText = str_replace( "[i]", "<i>", $bodyText );
    $bodyText = str_replace( "[/b]", "</b>", $bodyText );
    $bodyText = str_replace( "[/i]", "</i>", $bodyText );
    $bodyText = str_replace( "[code]", "<div class='divCode'>", $bodyText );
    $bodyText = str_replace( "[/code]", "</div>", $bodyText );
    $bodyText = str_replace( "[img]", "<img alt='Picture' class='postPic' src='", $bodyText );
    $bodyText = str_replace( "[/img]", "' />", $bodyText );
    $bodyText = str_replace( "[url]", "", $bodyText );
    $bodyText = str_replace( "[/url]", "", $bodyText ); 
    
    //De links converteren
    $bodyText = CreateLinks($bodyText);
    return $bodyText;
}

Eerst had ik de code-tags onderin staan en nu verplaatst naar het midden. Ik dacht dat er misschien een buffer zou kunnen zijn volgelopen, maar het heeft niets geholpen.

Voor zover ik na kan gaan zou deze functie gewoon moeten werken.
Iemand een suggestie?

[edit]
PS: De tekst die vertaald wordt bevind zich in een div.
Deze div heeft de style
code:
1
2
3
4
5
6
div.postContent
{
font-size           : 10pt;
color               : #020202;
background-color    : #FFFFFF;
}

Dat zou volgens mij niet uit moeten maken, want volgens mij kun je wel meerdere div's in elkaar hebben.

[ Voor 5% gewijzigd door Jan_V op 01-09-2007 20:41 ]

Battle.net - Jandev#2601 / XBOX: VriesDeJ


Acties:
  • 0 Henk 'm!

  • intoxicated
  • Registratie: Januari 2001
  • Niet online

intoxicated

Haaaai :w | ALT-S

'k Kan je probleem niet reproduceren, zowel onder php4 als php5 geeft je functie (als ik de CreateLinks even weg comment) gewoon goede output met een simpele teststring als deze:
code:
1
[code]woei[/code][i]woei[/i]


Is het misschien een probleem met de regex in je CreateLinks-functie?

"Anyone who does not agree with me is mentally sick, and should be shot I'm afraid to say."
- Pastor Richards @ VCPR


Acties:
  • 0 Henk 'm!

  • Jan_V
  • Registratie: Maart 2002
  • Laatst online: 22:19
Toch bedankt voor het proberen.
Ik had ook niet verwacht dat dit te reproduceren viel, aangezien er gewoon gebruik gemaakt wordt van de PHP functies.
Een voorbeeld van waar het fout gaat is hier te vinden:
http://www.freezco.com/index.php?postID=58

Hier staat ergens de tekst:

In PHP kun je dan met de functie preg_replace de reguliere expressie zo gebruiken.

$pattern1 = "/\s((www|http|ftp)(\W+\S+[^).,:;?\]\} \r\n$]+))/";
$pattern2 = " <a href=\"$1\">$1</a>";
$text = preg_replace($pattern1, $pattern2, $text);

Gelukkig kon ik het testen in de maand augustus, aangezien ik daar enkele posts had met hyperlinks er in verstopt.

Zoals misschien wel duidelijk zal zijn staan in de database de code-tags om de PHP-code in deze tekst. Ook staan deze tags om de andere code die in de post terug is te vinden, maar 1 voorbeeld hier volstaat wel.

De functie CreateLink met z'n reguliere expressies heb ik vandaag pas toegevoegd, dus daar zou het niet aan kunnen liggen, aangezien de code-tag vertaling er al minstens 6 maanden in zit en nooit heeft gewerkt.

Als ik morgen tijd kan vinden zal ik weer verder proberen te debuggen. Zal het ook proberen met andere tags, bijvoorbeeld code2 of een [pietje]-tag en kijken of dat wel werkt. Als dat niet werkt de statische html bewerken en kijken of dat werkt.

Voor nu houdt ik het echter even voor gezien. Even nieuwe inspiratie en motivatie op doen.

Battle.net - Jandev#2601 / XBOX: VriesDeJ


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Als je [code] door "piet" vervangt en het dan wel ziet, lijkt het me dat je de div er later weer uitfiltert. Roep je misschien ergens strip_tags aan? Vervang return $bodyText eens door die($bodyText) om te zien of de functie wel de juiste string doorgeeft.

let ook eens op SQL injection in je URL; 'or die(mysql_error())' geeft hier onnodig veel informatie weg, dit wil je alleen gebruiken om tijdelijk iets te testen.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Je weet 100% zeker dat je nergens strip_tags of een zelfgebouwde variant hierop eroverheen haalt? :)

Probeer anders ook strtr eens:
PHP:
1
2
3
4
5
6
$tags = array(
  '[code'] => '<div class="code">',
  '[img]' => '<img src="',
  // etc.
);
$input = strtr($input, $tags);

edit: ^^ had hetzelfde idee

[ Voor 10% gewijzigd door user109731 op 01-09-2007 22:01 ]


Acties:
  • 0 Henk 'm!

  • Jan_V
  • Registratie: Maart 2002
  • Laatst online: 22:19
Ik kan mezelf wel voor het hoofd slaan.
Er werd in een van m'n bestanden inderdaad gebruik gemaakt van de strip_tags() functie.
Toendertijd leek het me een handige functie, waardoor ik m'n W3C-validatie goed kon behouden (aangezien er dan moeilijker vreemde constructies voor kunnen komen).

Dit werd er gebruikt
PHP:
1
2
3
$strReturn .= "<div class='postContent'>";
$strReturn .= strip_tags(replacing($strContent), '<br><a><b><i><img>');
$strReturn .= "</div>";


Nu heb ik de div-tag er aan toegevoegd en het werkt.
Dit vergeet ik in ieder geval niet snel weer.

Trouwens
let ook eens op SQL injection in je URL; 'or die(mysql_error())' geeft hier onnodig veel informatie weg, dit wil je alleen gebruiken om tijdelijk iets te testen.
Men gebruikt normaliter dus 'zelfgemaakte' foutafhandeling, iets als echo "er is iets fout gegaan met SQL"?
Toen ik de pagina's ontwikkelde heb ik daar nooit echt bij stil gestaan. Wel een goede tip. Zal ze morgen vervangen door andere foutmeldingen, of de eerstvolgende dag dat ik weer ga php'en.

In ieder geval bedankt voor het strip_slashes probleem.

Battle.net - Jandev#2601 / XBOX: VriesDeJ


Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 23:04
Ik zou trouwens toch overwegen om een wat uitgebreidere oplossing (die met je regex :P) te gebruiken om je UBB tags te parsen. Simpelweg [/code] vervangen door </div> maakt het wel erg makkelijk om de complete layout te verneuken met '[/code][/code]' ... ;)

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Xander schreef op zondag 02 september 2007 @ 00:32:
Ik zou trouwens toch overwegen om een wat uitgebreidere oplossing (die met je regex :P) te gebruiken om je UBB tags te parsen. Simpelweg [/code] vervangen door </div> maakt het wel erg makkelijk om de complete layout te verneuken met '[/code][/code]' ... ;)
Met hem :)

Zou als ik jou was eens kijken naar de PEAR BBCodeParser, is een mooie stackbased parser die je ook goed als basis voor uitbreidingen kan gebruiken.

Overigens lijken veel van de eerste preg_replace's hetzelfde te doen als htmlentities(), iets met wiel en opnieuw uitvinden ;)

[ Site ] [ twitch ] [ jijbuis ]

Pagina: 1