Vraag & Antwoord

Webprogrammeren & scripting

[PHP] Probleem met Regular Expressions

10 antwoorden
  • 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
  • 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](:\))/";
  • wild guess: /^(:\))|\s(:\))/
  • Maw: je moet gewoon op 2 verschillende patronen checken... Iedereen bedankt, - Bas
  • Nog een amateur oplossing: voor elke string een extra spatie plakken, werkt prima :D wimb
  • 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.
  • 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
  • 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.
  • [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
  • 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.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.