Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

Regexp PHP --> javascript

None
13 antwoorden
  • Voor phpBB 3.x heb ik een mod gemaakt die afbeeldingen stript uit quotes en ze vervangt door een link. Gaat perfect als je in een topic iemand quote, maar in phpBB 3 kun je ook terwijl je een antwoord schrijft in de topic review op een quoteknop drukken en dan wordt dat middels javascript in je tekstvak geplakt. Daarop werkt mijn mod niet (logisch, want totaal ander bestand/code). De code die ik voor het PHP deel heb gebruikt ziet er zo uit:

    [code:1:e9bdce7998]preg_match_all('#\[code\](.*?)\[/code\]#is', $inmessage, $qcode);
    $crepl = str_replace('[img]', '[img]', $qcode[1]);
    $replacement = str_replace($qcode[1], $crepl, $inmessage);
    $replacement = preg_replace('#\[url=
    *(.*(jpg|jpeg|gif|png|bmp))
    *\]
    *\[img\]
    *(.*)
    *\[/img\]
    *\[/url\]#iU', '[ [url=$1]'. $user->lang['IMAGE'] .'[/url] ]', $replacement);
    $replacement = preg_replace('#\[url=
    *(.*)
    *\]
    *\[img\]
    *(.*)
    *\[/img\]
    *\[/url\]#iU', '[ [url=$1]'. $user->lang['IMAGE'] .'[/url] ]', $replacement);
    $replacement = preg_replace('#\[img\]
    *(.*)
    *\[/img\]#iU', '[ [url=$1]'. $user->lang['IMAGE'] .'[/url] ]', $replacement);
    $inmessage = str_replace($inmessage, $replacement, $inmessage);
    $inmessage = str_replace($crepl, $qcode[1], $inmessage);
    $message_parser->message = '[quote="' . $post_data['quote_username'] . '"]' . $inmessage . "[/quote]
    ";[/code:1:e9bdce7998]
    Dat wil ik nu dus om gaan bouwen naar javascript, maar da's op zijn zachtst gezegd niet mijn sterkste kant. Ik heb wel wat tutorial sites gevonden, maar die helpen me niet veel verder (blijven heel basic van "je kunt op die manier testen";). Kan iemand me een zetje geven in de goede richting om bovenstaande in te bouwen voor onderstaande (wat dus het js gedeelte is)?

    [code:1:e9bdce7998]insert_text('[quote="' + username + '"]' + theSelection + '[/quote]');[/code:1:e9bdce7998]














  • Waar heb je precies problemen mee? Weet je niet hoe de reguliere expressies in JavaScript werken, of weet je niet hoe je de tekst in de <textarea> kunt vervangen?

    Even terzijde: ik kwam laatst langs een blog waarop iemand bezig is om alle PHP functies om te zetten naar javascript functies. Misschien heb je er wat aan:
    http://kevin.vanzonneveld.net/techblog/category/php2js/

    Overigens heb je voor het vervangen van tekst met reguliere expressies niet 1 van de functies van Meneer Van Zonneveld nodig. In het volgende voorbeeld laat ik zien hoe dat moet (gejat uit O'Reilly's Regular Expression Pocket Reference):[code:1:a6b923ab70]var text = "Hello world. <br>";
    var pattern = /<br>/i;
    text.replace(pattern, "<br />"; [/code:1:a6b923ab70]Deze code vervangt bijvoorbeeld alle <br>'s met <br />. De i modifier staat voor case-insensitive.
  • [quote:c70a9d8575="Buur"]Waar heb je precies problemen mee? Weet je niet hoe de reguliere expressies in JavaScript werken, of weet je niet hoe je de tekst in de <textarea> kunt vervangen?[/quote:c70a9d8575]Kortgezegd heb ik gewoon heel weinig ervaring met javascript. Simpele dingetjes als mouse-events, window.opens etc heb ik wel eens gebruikt, maar ik heb nog nooit complete functies als deze bewerkt, laat staan beschreven. Reguliere expressies in javascript heb ik wel wat over gevonden, maar ik snap nog niet hoe ik een preg_match_all in javascript moet doen bijvoorbeeld.
    [quote:c70a9d8575="Buur"]
    Even terzijde: ik kwam laatst langs een blog waarop iemand bezig is om alle PHP functies om te zetten naar javascript functies. Misschien heb je er wat aan:
    http://kevin.vanzonneveld.net/techblog/category/php2js/[/quote:c70a9d8575]Die ga ik zeker bekijken, bedankt!
    [quote:c70a9d8575="Buur"]
    Overigens heb je voor het vervangen van tekst met reguliere expressies niet 1 van de functies van Meneer Van Zonneveld nodig. In het volgende voorbeeld laat ik zien hoe dat moet (gejat uit O'Reilly's Regular Expression Pocket Reference):[code:1:c70a9d8575]var text = "Hello world. <br>";
    var pattern = /<br>/i;
    text.replace(pattern, "<br />"; [/code:1:c70a9d8575]Deze code vervangt bijvoorbeeld alle <br>'s met <br />. De i modifier staat voor case-insensitive.[/quote:c70a9d8575]Die had ik al begrepen (maar toch bedankt), maar hoe zit het als ik alles binnen code-tags wil afvangen, in het resultaat (wat in het PHP-stuk in de array $qcode staat) alles wat img-tags heeft omzetten, etc? Is er in ook javascript een verschil zoals in PHP tussen een preg_replace en een str_replace?

    En als ik dit in javascript wil zetten, hoe doe ik dat dan?
    [code:1:c70a9d8575]$replacement = preg_replace('#\[img\]
    *(.*)
    *\[/img\]#iU', '[ [url=$1]'. $user->lang['IMAGE'] .'[/url] ]', $replacement);[/code:1:c70a9d8575]

  • Even kijken hoor… Helaas is mijn JavaScript niveau ook niet alles (verre van dat), maar misschien kan ik je toch een stukje verder helpen. Je vraagt hoe je preg_match_all in JavaScript moet doen, en verderop heb je het over preg_replace, da's wat anders. Die preg_match_all weet ik niet, maar preg_replace doet hetzelfde als de methode 'replace' van JavaScript, zoals ik in het gejatte O'Reilly voorbeeldje liet zien. Het verschil is dat preg_replace een functie is, en dus een return value geeft, en dat .replace een methode is, en dus het object (in dit geval een normale string) gewoon bewerkt, zeg maar… Dus in PHP wordt het dan:[code:1:1640c89e5d]$nieuwetekst = preg_replace(bla, bla, $oudetekst);[/code:1:1640c89e5d]en in JavaScript gewoon:[code:1:1640c89e5d]oudetekst.replace(pattern, oudetekst);[/code:1:1640c89e5d]en dan heeft oudetekst een nieuwe waarde gekregen…

    In PHP is het verschil tussen preg_replace en str_replace heel eenvoudig: bij preg_replace kun je reguliere expressies gebruiken, bij str_replace niet. De methode replace van JavaScript komt overeen met preg_replace, en voor een str_replace verwijs ik je weer naar Kevin van Zonneveld :wink:

    Nu zat ik vanmiddag op mijn werk en had ik dat boekje bij de hand, en nu ben ik thuis waar ik dat boekje niet heb, dus nou loop ik even vast. Ik weet namelijk niet hoe je gevonden patronen (die je in PHP zoekt door er haakjes omheen te zetten, en terug zet met $1, $2, $3 etc) terug zet in de output. Wat ik je wel alvast kan zeggen is dat $user->lang['IMAGE'] natuurlijk niet gaat werken in JS, dus je moet even zeggen wat daar dan voor in de plaats moet…

    Wordt vervolgd. Misschien heb je ondertussen ook ergens een voorbeeld staan van hoe ver je nu bent, en/of een voorbeeld van hoe het moet worden?
  • Ik was inderdaad al aan het knutselen, maar goed dat ik nog even 'F5-de' voordat ik postte. :)

    Ik heb nu een begin:
    [code:1:eb1586c6a6] theSelection = theSelection.replace(/\[url=(.*(jpg|jpeg|gif|png|bmp))\]\[img\](.*)\[\/img\]
    *\[\/url\]/ig, '[ [url=$1]Afbeelding[/url] ]');
    theSelection = theSelection.replace(/\[url=(.*)\]\[img\](.*)\[\/img\]
    *\[\/url\]/ig, '[ [url=$1]Afbeelding[/url] ]');
    theSelection = theSelection.replace(/\[img\](.*?)\[\/img\]/ig, '[ [url=$1]Afbeelding[/url] ]');
    insert_text('[quote="' + username + '"]' + theSelection + '[/quote]');
    [/code:1:eb1586c6a6]Zoals je ziet werkt het terugroepen hetzelfde als bij PHP. Ook gebruik ik nu even de hardcoded "Afbeelding" ipv $user->lang['IMAGE'].

    Bovenstaande vangt in principe [b:eb1586c6a6]alles[/b:eb1586c6a6] af, en da's nu net niet wat ik wil. ;)
    Dit vervangt namelijk ook hetgeen wat binnen code-tags staat, en dat is niet de bedoeling. In de PHP-variant heb dat gedaan door een preg_match_all en daar aan begin en eind een str_replace doorheen gooien, maar dat gaat dus niet. Ik heb het nu zo geprobeerd, maar dit heeft geen resultaat:
    [code:1:eb1586c6a6] var qcode = theSelection.match(/\[code\](.*?)\[\/code\]/ig);
    var qrepl = qcode.replace(/\[img\]/gi, '&#91;img&#93;');[/code:1:eb1586c6a6]
    Ben ik dus nog even mee aan het stoeien, maar alle input is welkom. :)

  • Weet je wat een methode is? Je doet:[code:1:360793f19e]theSelection = theSelection.replace(blabla, blablabla);[/code:1:360793f19e]Maar dat is dubbelop. Als je gewoon[code:1:360793f19e]theSelection.replace(blabla, blablabla);[/code:1:360793f19e]
    doet, dus zonder dat eerste gedeelte, dan heeft theSelection al een andere waarde. Maar goed, het maakt niet uit want wat jij doet werkt ook, maar slaat niet echt ergens op. Na het uitvoeren van deze regel:[code:1:360793f19e]var qrepl = qcode.replace(/\[img\]/gi, '[img]');[/code:1:360793f19e]hebben qrepl en qcode dezelfde waarde! qcode verandert ook van waarde! In de php variant:[code:1:360793f19e]$qrepl = str_replace('zoek', 'vervang', $qcode);[/code:1:360793f19e]is dat niet het geval. Dan is $qcode nog steeds hetzelfde, en heeft $qrepl de aangepaste waarde. Maar dat alles terzijde, nu eens naar het eigenlijke probleem kijken.

    Ik heb even op je duurzaamheidsforum gespiekt, en daar zie ik niet waarom je JavaScript zou moeten gebruiken om de quote om te zetten. Waarschijnlijk ben je nu dan ook met een ander forum bezig? Kan je misschien laten zien waar je bezig bent, want ik snap nog steeds de eigenlijke bedoeling niet: Je wil een bericht uit een forum quoten waar een plaatje in staat. Betekent dit dat de <textarea> waar de reactie in komt al op het scherm staat? En dat, als men bij een eerder gepost bericht op quote klikt, dit dan in dat tekstveld verschijnt, en dat de plaatjes dan vervangen zijn door de link naar de plaatjes? Klopt dat?
  • [quote:bcd8efc86a="Buur"]Weet je wat een methode is? [/quote:bcd8efc86a]Dat begreep ik toen ik je vorige post nog eens doorlas, maar toen had ik die code al zo staan. Wat precies een methode inhoudt weet ik echter niet; ik begrijp dat een methode iets is wat je ergens [i:bcd8efc86a]direct op[/i:bcd8efc86a] toepast in plaats van [i:bcd8efc86a]ergens mee[/i:bcd8efc86a]?
    [quote:bcd8efc86a="Buur"]Ik heb even op je duurzaamheidsforum gespiekt, en daar zie ik niet waarom je JavaScript zou moeten gebruiken om de quote om te zetten. [/quote:bcd8efc86a]Het is met name voor Sword Facts Benelux (veel foto's), maar die is gesloten voor gastgebruikers. Bovendien heb ik de wijzigingen voorlopig alleen maar op een lokale XAMPP-server draaien. De onderliggende software is echter hetzelfde, dus Duurzaamheidsforum voldoet wel voor het idee.
    Neem bijvoorbeeld dit topic. Daar kun je inderdaad met de quote-knop op reageren, en dan wordt posting.php geladen. Daarin heb ik de PHP-code toegevoegd die precies doet wat ik wil. Zit je echter al in het antwoordscherm, dus hier en bedenk je je dan dat je nog een voorgaand bericht wil quoten, dan kun je onderin het scherm de berichtgeschiedenis vinden. Daar vind je ook weer een quote-knop, waarmee je dus het betreffende bericht als citaat in je tekstveld krijgt. Dat werkt met javascript, om precies te zijn deze. Het stuk dat de quotes regelt begint op lijn 192, het stuk waar ik in werk op 248.

    Wat ik nu wil, is dat als er in een bericht staat:
    ***
    Bla bla bla, kijk eens wat een mooi plaatje:
    [img:bcd8efc86a]http://forum.computertotaal.nl/phpBB2/templates/ct/images/logo.gif[/img:bcd8efc86a]
    Bla bla bla einde bericht.
    ***

    Als je dit quote, het omgezet wordt in:
    ***
    [quote:bcd8efc86a]Bla bla bla, kijk eens wat een mooi plaatje:
    [ Afbeelding ]
    Bla bla bla einde bericht.[/quote:bcd8efc86a]
    ***

    Daarvoor heb ik totaal 3 regels (zie eerder gepostte codes) om thumbnails en imageshack-links af te vangen, maar dat zijn details die ik in principe ook al opgelost heb.

    Hetgeen wat ik nu nog wil uitsluiten, is dat als iemand in een vorig bericht binnen codeblokken de code heeft laten zien om een afbeelding te plaatsen en iemand dat weer quote, de omzetting naar een link [b:bcd8efc86a]niet[/b:bcd8efc86a] plaatsvindt. Daarvoor had ik bij het PHP-stuk gezorgd dat er, vóórdat de omzetting plaatsvindt, er eerst binnen de quote gekeken wordt of er codeblokken zijn en indien ja, binnen dat codeblok de blokhaken van &#91img] omgezet worden naar special character code, zodat de latere reguliere expressie om de afbeelding om te zetten naar een link die niet meer herkent. Dus, opgesomd moet de totale code doen:
      [*:bcd8efc86a]Zoek binnen het citaat naar codeblokken [*:bcd8efc86a]Zoek binnen de codeblokken naar &#91img] en vervang daarvan de blokhaken door special character codes (#91 en #93) [*:bcd8efc86a]Zoek binnen het citaat naar afbeeldingen en vervang die door links [*:bcd8efc86a]Vervang binnen de codeblokken de special character codes weer door blokhaken (voor dubbele veiligheid)[/list:o:bcd8efc86a] Stap 3 heb ik geheel voor elkaar (buiten dat ik het dubbelop had gedaan, maar dat is zo te fixen), stap 1, 2 en 4 lijken niet te werken. Voor zover ik het begrijp (maar ik kan er natuurlijk heel wel naast zitten) krijg ik door de code [code:1:bcd8efc86a]var qcode = theSelection.match(/\[code\](.*?)\[\/code\]/ig); [/code:1:bcd8efc86a] in qcode een array van alle codeblokken (=stap 1). Is dat correct?
  • [quote:512c5a1f32="Ger"]Wat precies een methode inhoudt weet ik echter niet; ik begrijp dat een methode iets is wat je ergens [i:512c5a1f32]direct op[/i:512c5a1f32] toepast in plaats van [i:512c5a1f32]ergens mee[/i:512c5a1f32]?[/quote:512c5a1f32]"Methode" is in dit geval een term uit de wereld van het Objectgeörienteerd Programmeren. Je kunt het zien als een functie die onderdeel is van een object (meestal een instantie van een klasse) en die alleen via het object aangeroepen kan worden. Het aanroepen van een methode heeft dan ook alleen effect op het object zelf, al kan het wel een waarde retourneren. (Enkele uitzonderingen daargelaten!) Het is dan ook altijd goed te onthouden dat een methode en een functie [b:512c5a1f32]niet[/b:512c5a1f32] hetzelfde zijn.

    - Bas
  • Ik heb 'm! :D

    De fout zat 'm erin dat je geen reguliere expressie op een array kunt loslaten. Dat heb ik dus met een loop gedaan, al was het even zoeken naar het equivalent voor een foreach(). Die heb ik gevonden in for…in().
    Daarmee kom ik tot de volgende code:
    [code:1:2e4f33802a]if (theSelection)
    {
    var key;
    var qcode = theSelection.match(/\[code\](.*?)\[\/code\]/ig);
    for (key in qcode)
    {
    qrepl = qcode[key].replace(/\[img\]/gi, '[img]');
    theSelection = theSelection.replace(qcode[key], qrepl);
    }
    theSelection = theSelection.replace(/\[url=(.*(jpg|jpeg|gif|png|bmp))\]\[img\](.*)\[\/img\]
    *\[\/url\]/ig, '[ [url=$1]Afbeelding[/url] ]');
    theSelection = theSelection.replace(/\[url=(.*)\]\[img\](.*)\[\/img\]
    *\[\/url\]/ig, '[ [url=$1]Afbeelding[/url] ]');
    theSelection = theSelection.replace(/\[img\](.*?)\[\/img\]/ig, '[ [url=$1]Afbeelding[/url] ]');
    theSelection = theSelection.replace(/[img]/gi, '[img]');
    insert_text('[quote="' + username + '"]' + theSelection + '[/quote]');
    }
    [/code:1:2e4f33802a]Zoals jullie zien, heb ik hier toch weer [b:2e4f33802a]theSelection = theSelection.replace()[/b:2e4f33802a] gebruikt. Dit blijkt toch nodig te zijn, want als ik zeg:
    [code:1:2e4f33802a]theSelection.replace(qcode[key], qrepl);
    insert_text(theSelection);[/code:1:2e4f33802a]
    Dan blijkt theSelection onveranderd. Met bovenstaande gaat het wel goed. Wat ik me daarbij dan bedenk en vervolgens afvraag: jullie zeggen dat niet voor niets, zit hier nog een gevaar in m.b.t. browsers/javascriptversies of andere zaken?

  • [quote:f93fed0946="Ger"]Wat ik me daarbij dan bedenk en vervolgens afvraag: jullie zeggen dat niet voor niets, zit hier nog een gevaar in m.b.t. browsers/javascriptversies of andere zaken?[/quote:f93fed0946]Ik denk dat het spaak loopt bij OOP, JavaScript is dat namelijk eigenlijk niet (net zo min als PHP, overigens). De programmeurs van beide scriptingtalen proberen echter wel mogelijkheden te bieden die het populaire paradigma van OOP benaderen. Wat je dus krijgt is een combinatie van verschillende soorten talen door elkaar heen, wat tot deze situatie kan leiden. Ik zou er niet te veel van wakker liggen.

    Wat wél belangrijk is, is een script dat in alle browsers werkt. Daar kan ik kort over zijn: JavaScript is een dialect van ECMA Script, een gestandaardiseerde syntax/sematiek, die steeds beter door alle browsers wordt ondersteund. Probeer dat aan te houden en dan zal het meestal goed zijn. Een alternatief is het gebruik van zogenaamde JavaScript Libraries, die doorgaans eigenaardigheden van browsers zelf afvangen. In jouw huidige situatie is laatstgenoemde oplossing overigens overkill.

    Sorry voor alle technische termen, maar ik dacht dat je je misschien wilde verdiepen in de stof, en dan kan het nog wel eens handig zijn om te weten waar je precies naar moet zoeken.

    Succes! :D

    - Bas
  • [quote:7b8748a35b="BasHamar"]Wat wél belangrijk is, is een script dat in alle browsers werkt. [/quote:7b8748a35b]Jep, en laat nou net weer IE dwarsliggen. :?

    [quote:7b8748a35b="BasHamar"]Daar kan ik kort over zijn: JavaScript is een dialect van ECMA Script, een gestandaardiseerde syntax/sematiek, die steeds beter door alle browsers wordt ondersteund. Probeer dat aan te houden en dan zal het meestal goed zijn. [/quote:7b8748a35b]Daar ga ik dus eens even naar kijken, bedankt.
    [quote:7b8748a35b="BasHamar"]Een alternatief is het gebruik van zogenaamde JavaScript Libraries, die doorgaans eigenaardigheden van browsers zelf afvangen. In jouw huidige situatie is laatstgenoemde oplossing overigens overkill.[/quote:7b8748a35b]Kende de term nog niet, maar wat ik zo lees lijkt dat er inderdaad op.
    [quote:7b8748a35b="BasHamar"]
    Sorry voor alle technische termen, maar ik dacht dat je je misschien wilde verdiepen in de stof, en dan kan het nog wel eens handig zijn om te weten waar je precies naar moet zoeken.[/quote:7b8748a35b]Nu ja, dit soort dingen is allemaal puur hobbyen voor me. Maar ook met hobby's heb ik altijd de instelling: ik wil het niet alleen werkend hebben, maar ook goed werkend. Een hoger "snapniveau" dan dingetjes kopiëren is dan wel een vereiste. :)
    [quote:7b8748a35b="BasHamar"]
    Succes! :D[/quote:7b8748a35b]Bedankt! :D
    (en ook een bedankje richting Buur natuurlijk!)
  • Pffrt ik baal als een stekker dat ik je niet heb kunnen helpen met die reguliere expressie, aangezien ik dat altijd erg leuk (puzzel)werk vind. Ik kon er in de afgelopen dagen gewoon niet de tijd voor vinden :? Maar uiteraard goed dat het werkt. Maar het script werkt niet in IE dus? (Typisch!). Prettig weekend verder.
  • [quote:25ccb5d2e0="Buur"]Pffrt ik baal als een stekker dat ik je niet heb kunnen helpen met die reguliere expressie, aangezien ik dat altijd erg leuk (puzzel)werk vind. Ik kon er in de afgelopen dagen gewoon niet de tijd voor vinden :? Maar uiteraard goed dat het werkt. [/quote:25ccb5d2e0]Nu ja, je hebt me wel een eind de goede richting op gezet hoor. Wat dat betreft dus zeker bedankt!
    [quote:25ccb5d2e0="Buur"]Maar het script werkt niet in IE dus? (Typisch!). [/quote:25ccb5d2e0]Nope. :(
    Nu ik eindelijk de grootste valkuilen van IE mbt CSS doorheb, begin ik met JS in IE te klooien. Ik heb helaas nog geen kans gehad om daar in te duiken, en eerlijk gezegd ook nog geen idee waar het überhaupt precies in kan zitten. Dat wordt dus weer fijn debuggen, testen, commenten, etc. :?

    Ik loof eeuwige roem uit voor degene met de gouden tip! :D

Beantwoord deze vraag

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