Ga naar inhoud

[PHP] Probleem met Regular Expressions


Aanbevolen berichten

Ja hoor, ben ik weer... Ik ben een soort van eigen BB code aan het maken. In die code laat ik ook smileys parsen mits er een spatie aan vooraf gaat. Dit om problemen met evt code te ontlopen. Nu zit ik echter met het probleem dat een smiley aan het begin van een zin niet geparst wordt, uiteraard omdat er geen spatie voor zit. Hoe kan ik dit oplossen? De huidige code is als volgt:[code:1:3b84217568]$pattern = "/\s(:\))/"; $replacement = "<img src=\"smile.gif\" alt=\"$1\" />"; // $plaintext is een variabele met de te parsen tekst preg_replace($pattern, $replacement, $plaintext);[/code:1:3b84217568]Ook heb ik iets anders geprobeerd wat niet werkte:[code:1:3b84217568]$pattern = "/([\s|\^])(:\))/"; $replacement = "$1<img src=\"smile.gif\" alt=\"$2\" />"; // $plaintext is een variabele met de te parsen tekst preg_replace($pattern, $replacement, $plaintext);[/code:1:3b84217568]En dit werkt ook niet:[code:1:3b84217568]$pattern = "/([\s|\^\W])(:\))/"; $replacement = "$1<img src=\"smile.gif\" alt=\"$2\" />"; // $plaintext is een variabele met de te parsen tekst preg_replace($pattern, $replacement, $plaintext);[/code:1:3b84217568]Als er een spatie voor de smiley staat (in dit geval " :)") dan werken ze alledrie prima, maar ik krijg 'm dus niet zover dat'ie aan het begin van de regel ook een plaatje moet zetten ipv de smiley. Hopelijk is er iemand met ervaring op dit gebied... - Bas
Link naar reactie
Je zou die eis misschien kunnen laten vallen, dat er een spatie voor elke :) moet komen? Maar ja, dan krijg je natuurlijk weer dat er onbedoelde smileys ontstaan. Misschien zoiets: $pattern = "/((\s:\))|(^:\)))/"; Alleen nu match je wel de spatie erbij. Zul je in de omzettingstekst ook een spatie ervoor moeten zetten. Dan krijg je dus wel dat er ook een spatie verschijnt voor elke smiley die aan het begin staat van elke regel. Als je dat niet wil, dan weet ik niets anders dan er twee regexp's er van te maken: $pattern1 = "/(\s:\))/"; $pattern2 = "/(^:\))/"; Hmm, wacht eens, dit zou ook moeten werken: $pattern = "/[\s\n](:\))/";
Link naar reactie
Om de code niet te zwaar te maken heb ik gekozen voor de oplossing van Wim, en dat werkt prima. Bedankt daarvoor! Nou heb ik nog een vraag: is het mogelijk om:[list=1:164935a6e1][*:164935a6e1]conditionele toevoegingen te maken;[*:164935a6e1]de volgorde "onbelangrijk" te maken.[/list:o:164935a6e1]Even ter verduidelijking:[code:1:164935a6e1]// Voorbeeldtag: // [bbtag="text" param1="text" param2="text"]Text[/bbtag] $pattern = "/\[bbtag=\"(.*)\"\s+param1=\"(.*)\"\s+param2=\"(.*)\"\](.*)\[\/bbtag\]/"; $replacement = "<a href=\"$1\" title=\"$2\" hreflang=\"$3\">$4</a>"; [/code:1:164935a6e1]Stel nou dat param2 zou ontbreken, kan ik dat in één patroon kunnen opvangen en doorverwerken in de link (door ook geen 'hreflang' toe te voegen) of moet ik gewoon een 2e patroon maken. En wat als param1 en param2 zijn omgedraait, kan ik dat ook op de juiste manier verwerken? Iedere hint of link is welkom, ik ben namelijk met een crash course regexps bezig. Hoe erg is de belasting van de server door regexps eigenlijk? Groeten en al erg veel dank, - Bas.
Link naar reactie
op http://www.php.net/manual/en/function.preg-replace.php vond ik dit:[code:1:2d18e1e48d]$string = "The quick brown fox jumped over the lazy dog."; $patterns[0] = "/quick/"; $patterns[1] = "/brown/"; $patterns[2] = "/fox/"; $replacements[2] = "bear"; $replacements[1] = "black"; $replacements[0] = "slow"; print preg_replace($patterns, $replacements, $string); /* Output ====== The bear black slow jumped over the lazy dog. */[/code:1:2d18e1e48d]Het enige wat ik niet snap is dat de output zo raar is :-? . Maar op zo'n soort manier zou je bijvoorbeeld kunnen kijken naar het patroon param1="" en het vervangen denk ik. -termin8or
Link naar reactie
Je zou het het resultaat van de eerste regexp kunnen gebruiken in een nieuwe regexp. http://www.php.net/manual/en/function.preg-replace-callback.php Ik heb eigenlijk geen idee hoe je dit moet toepassen in php. Misschien ongeveer zoiets: [code:1:9ad2b16967] function ubb($res) { $res[0]=preg_replace(/param1=\"(.*)\"/U,"href=\"$1\"",$res[0]); //hier nog meer regexp replaces. return $res[0]; } $text= preg_replace_callback("|^([bbtag=).+(\[\/bbtag\])$|U","ubb",$text); [/code:1:9ad2b16967] Ik weet ook niet eens of je wel die preg-replace-callback nodig hebt. Ik zag ook een voorbeeld met preg_replace waar ze een functie in het tweede argument gebruikten. (hmm, wat maakt die preg-replace-callback dan nog zinvol?) Ik weet ook niet of $res[0] de volledige string is van de match van de preg-replace-callback functie. Die moet je iig wel hebben.
Link naar reactie
[quote:631dda3dbe="termin8or"]Het enige wat ik niet snap is dat de output zo raar is [/quote:631dda3dbe]Omdat je de de array nog moet sorteren op de keys met [url=http://www.php.net/ksort]ksort()[/url]. De oplossing van hulpje lijkt me de juiste, ik ga me even wat meer verdiepen in de stof. Bedankt! - Bas
Link naar reactie
Je kan waarschijnlijk (niet getest) ook gewoon matchen op het patroon van een "parameter" ([color=blue:ea587f2cbc][i:ea587f2cbc]param="value"[/i:ea587f2cbc][/color:ea587f2cbc]), ongeacht welke dat is. Deze match kan je doorsturen naar een functie waarbinnen je pas de geldigheid van een parameter controleert (komt deze voor in een geldige set met parameters en is bijvoorbeeld de value geldig). Afhankelijk van de geldigheid kan je deze meenemen in de replace. Overigens wordt voor dit soort zaken vaak een stack-based parser gebruikt ipv regular expressions aangezien deze al snel beter performen en beter uitbreidbaar zijn.
Link naar reactie
Annie, bedankt voor je antwoord. Heb je misschien een link waar de werking van een stack-based parser wordt uitgelegd? Een stack bouwen is het probleem niet echt, maar hoe ik de rest precies moet gaan implementeren is me nog niet helemaal duidelijk... Dus als je me nog een zetje in de rug kan geven: graag! - Bas
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...