[php] Snellere globale ereg_replace manier?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Momenteel haal ik tekst op uit een database en wijzig een paar woorden, zoals wel duidelijk zal zijn waarom... Dit doe ik momenteel zo:
PHP:
1
2
3
4
5
6
7
8
   $txt = ereg_replace("\n", "<br>", $txt);
   $txt = ereg_replace("\\[pijl\]", "[img]'/images/bullet.gif'[/img]", $txt);
   $txt = ereg_replace("\\[vet\]", "<b>", $txt);
   $txt = ereg_replace("\\[/vet\]", "</b>", $txt);
   $txt = ereg_replace("\\[onderstreep\]", "<u>", $txt);
   $txt = ereg_replace("\\[/onderstreep\]", "</u>", $txt);
   $txt = ereg_replace("\\[cursief\]", "<i>", $txt);
   $txt = ereg_replace("\\[/cursief\]", "</i>", $txt);
Alleen met deze paar checks moet php 7 keer de tekst langslopen, dat bij langere teksten de snelheid niet echt ten goede komt. Mijn page vertraagde van 0,007 naar 0,01 seconden... Beetje zonde voor zoiets simpels.

Iemand een idee hoe ik met een keer de tekst langslopen in een keer alle code kan wijzigen zoals ik wil? In plaats van op deze lelijke inefficiënte manier?

Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

een extra html veld in je tabel zetten, dus enerzijds in bbcode anderzijds in html, hoef je dit niet iedere keer te parsen als het wordt opgevraagd maar slechts wanneer het wordt opgeslagen of gewijzigd.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 21:16

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Je doet dit toch niet elke keer 'on the fly'? Dus tekst opslaan in database en elke keer als het er uit wordt gehaald dit parsen? Je kan denk ik beter wanneer het wordt opgeslagen deze wijzigingen doorvoeren.

Of interpeteer ik je verhaal verkeerd?

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

@slm: Volgens mij bedoelt ie dat niet, toch?

Volgens mij is dit wel handig om naar te kijken:
http://nl2.php.net/manual/en/function.preg-replace.php

Vervang array's door andere array's, if you know what I mean.

Ik had eerst precies hetzelfde als jij (elke regel een str_replace / preg_replace). Ik heb toen ff een bench gedaan om te vergelijken of 'mijn nieuwe manier' (array vs array matchen) sneller was: het was 4x sneller bij mij (redelijk intensief getest).

[ Voor 48% gewijzigd door Cavorka op 21-09-2003 18:03 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 21:16

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Cavorka: Zou je een klein voorbeeld kunnen laten zien hoe jij het dan zou doen ?

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Natuurlijk: hier bijvoorbeeld het smilies gedeelte uit mijn forum:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$reformat_smilies = array("/\\[\}:\)\]/", "/\}:\\)/i", 
                        "/\\[:\)\]/", "/:\)/i", 
                        (...)
                        "/\\[:S\]/i", "/:S/i", 
                        "/\\[B\|\]/", "/B\|/") ;
$reformat_smilies_new = array("[img]'./images/smilies/evil.gif'[/img]", "[img]'./images/smilies/evil.gif'[/img]", 
                        "[img]'./images/smilies/smile.gif'[/img]", "[img]'./images/smilies/smile.gif'[/img]", 
                        (...)
                        "[img]'./images/smilies/confused.gif'[/img]", "[img]'./images/smilies/confused.gif'[/img]", 
                        "[img]'./images/smilies/doubleeyes.gif'[/img]", "[img]'./images/smilies/doubleeyes.gif'[/img]") ;

$message = preg_replace($reformat_smilies, $reformat_smilies_new, $message) ;


Zonder die (...)'s dus, maar anders was het een beetje lang.

En uit mijn logboek van mijn forum, hier een stukje, betreffende deze test:
1. - The for loops in the message clean-ups vs. replacing complete arrays & arrays with an eregi.
2-9-2003 17:23 + 3-9-2003 15:22 - Results:
2500 cycles:
for loop: 5.76 s
1 cycle: 0.0023046564 s

eregi_array_loose: 1.99 s
1 cycle: 0.0007975416 s

preg_replace_one_array: 1.81 s
1 cycle: 0.0007228836

Another striking results, holy mac. 4 Times as fast, and the lastest version (preg_replace) even faster still.
Waarbij eregi_array_loose toch nog drie keer over de tekst ging (ik matchte daar dus drie keer twee array's met elkaar), bij de laatste (pre_replace_one_array) had ik van deze drie dus een gemaakt: een match van twee array's.

[ Voor 255% gewijzigd door Cavorka op 21-09-2003 18:11 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 21:16

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Beetje onoverzichtelijk maar kan voorstellen dat het sneller is om te verwerken :). Ty voor het voorbeeld

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Hehe, ja die slashes van preg_replace zijn altijd een beetje gaar...

Het gaat om het idee. :p

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Waarom wordt toch altijd meteen naar regular expressions gegrepen als een simpele string vervanging voldoende is?
str_replace

Today's subliminal thought is:


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Str_replace is case sensitive... daarom.

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

Verwijderd

str_ireplace is dat niet... dus.

[edit]
Owja, maak dan meteen gebruik van die handige arrays als argumenten.

[ Voor 33% gewijzigd door Verwijderd op 21-09-2003 18:18 ]


Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Cavorka schreef op 21 September 2003 @ 17:58:
@slm: Volgens mij bedoelt ie dat niet, toch?
Waarschijnlijk niet, maar het is wel aan te bevelen. Ik had er eerst zelf ook niet aan gedacht voordat ik het een tijdje geleden hier ergens las.

Ook al krijg je die replacement 3-4x sneller door gebruik van arrays, nog steeds is het een aardige load op je server als je nagaat dat het vermenigvuldigd wordt door het aatal berichten per pagina en het aantal users gelijktijdig op de site.

Vandaar is opslaan als text die reeds is geparsed altijd sneller.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor de geïnteresseerden; dit is de eindoplossing... Veel sneller inderdaad!
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function getTxt($txt) {
   $sql = "SELECT `text` FROM `text` WHERE subject = '$txt'";
   $result = mysql_query($sql);
   $message = mysql_fetch_array($result, MYSQL_ASSOC);

   $bbcode = array("/\n/", "/\\[vet\]/i", "/\\[\/vet\]/i", "/\\[onderstreep\]/i", "/\\[\/onderstreep\]/i", "/\\[cursief\]/i", "/\\[\/cursief\]/i", "/\\[pijl\]/i");
   $html   = array("<br>", "<b>", "</b>", "<u>", "</u>", "<i>", "</i>", "[img]'/images/bullet.gif'[/img]");

   $message = preg_replace($bbcode, $html, $message[text]);

   print $message;
}

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Verwijderd schreef op 21 September 2003 @ 18:17:
str_ireplace is dat niet... dus.

[edit]
Owja, maak dan meteen gebruik van die handige arrays als argumenten.
Mja, maar:
'(PHP 5 CVS only)'.

Dus. :D

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

Verwijderd

Als je dan toch met regexps aan de gang gaat, kan je wellicht beter zorgen dat er altijd een eind tag is.

Dus [vet]hier een heleboel text[/vet] vervangen door <b>dezelfde text weer</b>

Dit voorkomt dat als iemand een [vet] tag gebruikt maar hem niet afsluit, alle onderstaande berichten ook vet worden.

Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
De oplossing die TheProspector nu gebruikt kan inderdaad makkelijk met een str_ireplace.

Voordeel van een Regexp is inderdaad dat je kan voorkomen dat tags niet goed geopend/gesloten worden, door inderdaad in een keer [b]randomtekst]/b] te matchen. En daar zijn tig topics over :)

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
mocean schreef op 22 september 2003 @ 09:51:
De oplossing die TheProspector nu gebruikt kan inderdaad makkelijk met een str_ireplace.

Voordeel van een Regexp is inderdaad dat je kan voorkomen dat tags niet goed geopend/gesloten worden, door inderdaad in een keer [b]randomtekst]/b] te matchen. En daar zijn tig topics over :)
Of de topicstarter zoekt even naar Stackbased parsers, dan heeftie helemaal geen problemen meer met verkeerd geneste tagse en missende sluittags enzo ;)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Met kortere tags (1 teken) kun je zoiets doen met regexp, ben ff vergeten hoe je het deed met langere vast iets met een (?:) achtige syntax.
code:
1
/\\[([buis])].*\\[\/\1]/

Note: de tagletter (hier b, u ,i of s wordt opgeslagen in $1

Bekijk anders ook eens de stack-bases UBB parser van ACM.

[ Voor 14% gewijzigd door Skaah op 22-09-2003 13:28 ]

Pagina: 1