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

PHP code --> SQL query

None
5 antwoorden
  • Ik kwam vandaag elders een vraag tegen van iemand die een forum probeert te converteren en tegen wat problemen aanstuit. In de database staan wat HTML-codes met links en plaatjes, met diverse soorten attributen en soms ook niet, dan weer single quotes, dan weer double quotes, etc.
    In het nieuwe forum gaat dat niet geparsed worden, dus dat zal omgebouwd moeten worden naar BBcode. Nu heb ik even zitten stoeien, en heb ik voor haar wel een PHP-methode gevonden:
    [code:1:7d89b21758]<?php
    $message='Falderie faldera, dit is een berichtje op het forum van Sandra. En weet je wat? Hier hebben een plaatje met een linkje: <a href="http://www.example.com/image_large.gif" target="_blank"><img src="http://www.example.com/image_small.gif" title="Klik voor grote afbeelding" alt="Kralenplaatje" width="320" height="240" /></a>
    Dat was nou een mooi kralenplaatje.';
    //We beginnen met de afbeeldingen, want in een afbeelding zal nooit iets genest zijn.
    //Met onderstaande wordt gezocht naar een img tag. Omdat de volgorde van attributen binnen tags niet altijd vaststaat, is deze tussenstap nodig.
    preg_match_all('#\<img(.*?)\>#i',$message, $matches );
    foreach ($matches as $totaalimg) {}
    unset($matches);
    foreach ($totaalimg as $totaal2img)
    {
    //Vervolgens zoeken we de src met double quotes op,
    preg_match_all('#src=\"(.*?)\"#i',$totaal2img, $matches );
    foreach ($matches as $preimg){}
    unset($matches);
    //Geen img tag met double quotes? Dan zou het single quotes moeten hebben
    $aantal=count($preimg);
    if ($aantal == 0)
    {
    unset ($preimg);
    preg_match_all("#src='(.*?)'#i",$totaal2img, $matches );
    foreach ($matches as $preimg){}
    unset ($matches);
    }
    //Met $preimg hebben we de bron van het plaatje. Nu dat omzetten naar een goede BBcode en dat in de plaats van het origneel zetten
    $message = preg_replace('#\<img(.*?)\>#i', '[img]'.$preimg[0].'[/img]', $message);
    }

    //Nu de links. Dit werkt overigens alleen voor [url=www.example.com]omschrijving[/url], maar het lijkt me dat dat ook al het benodigde is.
    //Ook hier weer zoeken naar het totaal, daarna kunnen we pas inzoomen op het href-attribuut
    preg_match_all('#\<a(.*?)\>#is',$message, $matches );
    foreach ($matches as $totaallink){}
    unset ($matches);
    foreach ($totaallink as $totaal2link)
    {
    //Vervolgens zoeken we de src met double quotes op,
    preg_match_all('#href=\"(.*?)\"#i',$totaal2link, $matches );
    foreach ($matches as $prelink){}
    unset($matches);
    //Geen link tag met double quotes? Dan zou het single quotes moeten hebben
    $aantal=count($prelink);
    if ($aantal == 0)
    {
    unset ($prelink);
    preg_match_all("#href='(.*?)'#i",$totaal2link, $matches );
    foreach ($matches as $prelink){}
    unset ($matches);
    }
    //Met $prelink hebben we de link. Nu dat omzetten naar een goede BBcode en dat in de plaats van het origneel zetten
    $message = preg_replace('#\<a(.*?)\>#i', '[url='.$prelink[0].']', $message);
    $message = str_ireplace('</a>', '[/url]', $message);
    }

    echo $message;
    ?>
    [/code:1:7d89b21758]
    Dit werkt op zich goed, maar wordt iedere keer uitgevoerd als een bericht wordt opgevraagd. Niet erg efficiënt dus, en regexps zijn ook niet de snelste.

    Ik vraag me af of dit op de een of andere manier direct op de database is uit te voeren, en het daar wordt opgeslagen? Dan hoef je het maar 1x te doen, en klaar is Kees.

    Is dit op de een of andere manier om te bouwen naar een SQL query die hetzelfde doet?
  • Waarom niet gewoon in een loop eenmalig alle berichten omzetten en opslaan? (Wel eerst een backup maken.)

    - Bas
  • Thanks, dat zat ik me later ook te bedenken, database benaderen, in de juiste tabel de boel laten uitvoeren en dan moet het ook lukken.
  • Ik zou het gewoon opslaan als bbcode.. wanneer je dat niet doet kan je later niet zomaar meer een bericht editen omdat je niet meer weet hoe het origineel eruit zag.

    Hier is een bestand waarin de bbcode netjes omgezet wordt naar html:
    http://tbdevnet.svn.sourceforge.net/viewvc/tbdevnet/trunk/TB/include/bbcode_functions.php?revision=132

    Je kan daar ook de bestanden bekijken waarin gepost wordt etc.

    Good luck
  • [quote:91c4c86d6d="yendis"]Ik zou het gewoon opslaan als bbcode.. wanneer je dat niet doet kan je later niet zomaar meer een bericht editen omdat je niet meer weet hoe het origineel eruit zag.[/quote:91c4c86d6d]Oh, da's geen probleem hoor, Invision 2.3.x werkt precies zo. Verwerken naar HTML en dan pas in de database zetten. En bij editten en quoten gewoon weer terugzetten. Zeker bij perl-based regeps win je daar een hoop snelheid mee.


    Maar goed, het hele probleem is al opgelost. Met bovenstaande code is alles netjes in standaard BBcode omgezet.

Beantwoord deze vraag

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