Voor de RegExp experts: /me

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 14-09 12:05
Okee, ik heb een leukigheidje inelkaar geflanst waarmee je / me (zonder spatie ;)) in " * Tuinhark " kunt laten veranderen.

Ziehier:<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>$lines = explode("\n", $text);
$text = "";
for ($i = 0; $i < sizeof($lines); $i++)
{
$tmp = eregi_replace("^/me (.*)", " <font color=\"$cfgFontMeColor\">* {USERNICKNAME} \\1</font>", $lines[$i]);
$tmp = eregi_replace("([ \t])/me (.*)", "\\1<font color=\"$cfgFontMeColor\">* {USERNICKNAME} \\2</font>", $tmp);
if ($i > 0) $tmp = "\n$tmp";
$text .= $tmp;
}
unset($lines); unset($tmp);[/quote]Ik heb het al getest enzo en het werkt, maar toch bekruipt me het idee dat het beter kan. Efficienter.

Ondanks dat ik een leuke tutorial heb bekeken (bij phpfreakz) vind ik deze truukjes met regular expressions nog erg lastig.

Graag jullie meningen/ideeën. :)

Verwijderd

Wat een ontzettend vaag stukje code... :)
Dit ga ik eerst ff bestuderen voor ik er wat over zeg...

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 15-09 20:25

dominic

will code for food

Wat een gek*t zeg..

In ASP, VBScript zeg je gewoon

response.write replace(inStr, "/me", strNick)

Klaar..

Wat is RegExp dan eigenlijk?

Download my music on SoundCloud


  • KlaasB
  • Registratie: Juli 2000
  • Laatst online: 01-07-2024
Zoiets?

$me = substr("$tekst", 0,4);
if ($me == "/me ") {
$tekst = substr("$tekst", 4);
$tekst = "* $gebruiker $tekst"; }

It's not a bug, it's a feature


  • Onno
  • Registratie: Juni 1999
  • Niet online
bitprobe: (en oh, KlaasB ook) Ehm... niet dus. Dan krijg je er geen font tags omheen... :)

Verwijderd

<flamebait mode>
Daarom is ASP ook veel minder leuk!
</flamebait mode>

Efficienter?
Ik zou ff niet weten hoe... Maar ik vind het lomp dat hij elke line afzonderlijk moet checken... Dat moet anders kunnen.

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 15-09 20:25

dominic

will code for food

Hij is goed :)

response.write "<font bla>" & replace(strInp, "/me", strNick) & "</font>"

ook goed..

Download my music on SoundCloud


  • Onno
  • Registratie: Juni 1999
  • Niet online
Ik ken verder btw geen PHP maar in Perl kan het zo:<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>$lines =~ s/\/me(.*)$/<font color="$cfgFontMeColor">* $nick$1<\/font>/m;[/quote]Vervangt alles vanaf / me t/m de eerstvolgende newline of het einde van je invoer door <font> ... </font>

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Ik kan het niet laten :) Ik zeg niet dat het beter is. Ik weet niet eens of het werkt, maar<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>$temp=split("^/me[<:space:>]$", $text);
$newtext=$temp[0];
for (reset($temp),next($temp);$tmp=current($temp);next($temp))
{
// Ik weet niet of hij * LuCarD bij $temp gooit.
// Als hij er wel bij gooit kan je str_replace gebruiken
$tmp="<font ..... >" . $tmp;
substr_replace($tmp,"</font>",strpos($tmp,"/n"),2);
$newtext.=$tmp;
}[/quote]Oke dit was even uit het losse handje zonder dat ik het heb kunnen testen. Maar ik denk wel dat je een idee krijgt van hoe en wat.

Waarom gebruik je unset?? variablen zijn weg zodra een script eindigt. En dan maakt hij ook weer het geheugen vrij. En al gooi je het in een functie is het vrij zodra de functie eindigt...

Programmer - an organism that turns coffee into software.


Verwijderd

In ASP, VBScript zeg je gewoon response.write replace(inStr, "/me", strNick)

Klaar..


Met het verkeerde... Je zet geen font tags om wat / me zegt heen.

Wat is RegExp dan eigenlijk?
Een beschrijving patroon. Zie verder je favoriete zoekmachine.

Verwijderd

In Perl kan het zo:

En als je dat na van backslashes een beetje ontdoet... En case-insesitive, en global...

$lines =~ s!/me(.*)$!<font color="$cfgFontMeColor">* $nick$1</font>!gim;

edit:

In PHP wordt dat dus:
$pattern = "!/me(.*)$!gim";
$replacement = "!<font color="$cfgFontMeColor">* $nick\\1</font>!";
$lines = preg_replace($pattern, $replacement, $lines);


Je hoeft het niet in $pattern en $replacement te doen, maar in PHP zijn regexen vervelend onleesbaar. Het is vaak toch al cryptisch...

  • Onno
  • Registratie: Juni 1999
  • Niet online
Samen komen we er wel uit. :)

Verwijderd

<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>Op 27 september 2000 10:01 schreef Onno het volgende:
Samen komen we er wel uit. :)[/quote]Jup. Zat al het antwoord hierboven in te kloppen toen ik keek naar wat hij wilde en je reply zag... :)

Trouwens met /x wordt het eventueel lekker leesbaar, weet niet of dat in PHP ook kan met preg_* functies.

Verwijderd

[NetEenNewbieMode]<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>Op 27 september 2000 09:08 schreef bitprobe het volgende:

Wat is RegExp dan eigenlijk?[/quote]Dat wil ik nou ook wel eens precies weten...
Ik kan me voorstellen wat het is, maar ik weet er het fijne niet van!

Als iemand mij dat nou duidelijk kan maken aan de hand van of een VB of een Perl voorbeeld... (verschil moet er wezen! ;)) ...ben ik weer helemaal happy voor de rest van de week! (niet dat dat zolang meer duurt *D)
[/NetEenNewbieMode]

  • tomato
  • Registratie: November 1999
  • Niet online
Zie voor een mooie beginners tutorial over regexen de bekende site www.phpbuilder.com, of anders www.devshed.com. Die op PHPBuilder is alleen PHP gericht, die op DevShed dacht ik wat algemener.

Waarom allemaal van die vage functies om eerst te splitten op / me enzo?!?
Dit is toch voldoende (PHP)?:<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>$s = preg_replace("|(/me)(.*)|i", "<FONT COLOR=\"FFFFFF\">* $naam\\2</FONT>", $s);[/quote]Je zou hoogstens kunnen zeggen dat regexen traag zijn en dat ze op deze manier de hele string moeten doorzoeken...

Verwijderd

Waarom allemaal van die vage functies om eerst te splitten op / me enzo?!?

Die stap waren we al voorbij :)

Dit is toch voldoende (PHP)?

$s = preg_replace("|(/me)(.*)|i", "<FONT COLOR=\"FFFFFF\">* $naam\\2</FONT>", $s);


Ik hoop maar dat het forum hier wat in veranderd heeft... Waarom /e? (Zie trouwens net dat /g niet nodig is als je preg_replace gebruikt omdat hij alle matches pakt, tenzij je zegt van niet.)

Je zou hoogstens kunnen zeggen dat regexen traag zijn en dat ze op deze manier de hele string moeten doorzoeken...

Ze moeten ook de hele string doorzoeken...

  • tomato
  • Registratie: November 1999
  • Niet online
Ik hoop maar dat het forum hier wat in veranderd heeft... Waarom /e?
Euh...ik zie nergens \e staan... Die i erachter is voor de case 'insensitiviteit' ;).

(Zie trouwens net dat /g niet nodig is als je preg_replace gebruikt omdat hij alle matches pakt, tenzij je zegt van niet.)
Ik weet niet wat /g is (perl optie?), maar in een preg in PHP set je de greediness met /U (is hier inderdaad niet nodig).

Verwijderd

Ik hoop maar dat het forum hier wat in veranderd heeft... Waarom /e?
Euh...ik zie nergens /e staan...
Zit ik effe te slapen... Da's de derde keer al in 10 minuten... :)

Die i erachter is voor de case 'insensitiviteit' ;).
Weet ik. Zie mijn post eerder...

Ik weet niet wat /g is
Global... Zie de docs online bij http://www.perl.com

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 14-09 12:05
<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>Op 27 september 2000 11:57 schreef tomato het volgende:
$s = preg_replace("|(/me)(.*)|i", "<FONT COLOR=\"FFFFFF\">* $naam\\2</FONT>", $s);[/quote]Ik heb deze code al geprobeerd. Jaja.. ;) Die had ik via CounterStrike gekregen. (En ja, ik wist dat jij hem had gemaakt. ;)) Ik was er niet helemaal tevreden mee... Hij gaat ook k#tten met URLs namelijk. :'(

Dus:

"/me" moet werken als het 't 1e is dat op een zin staat (dus, begin van een string, of direct na een \n binnen een string). Hij kleurt dan de hele regel (tot aan de eerstvolgende \n of einde van string).

"/me" moet werken als er een spatie/tab voor staat. Hij kleurt dan vanaf daar tot het einde van de regel (tot eerstvolgende \n of einde van string).

Verder moet "/me" NIET werken als het onderdeel is van een URL enzo...

Nou ja goed... ik ga even wat suggesties proberen. Mijn dank alvast. :)

Verwijderd

"/me" moet werken als het 't 1e is dat op een zin staat (dus, begin van een string, of direct na een /n binnen een string). Hij kleurt dan de hele regel (tot aan de 1e n of einde van string).

"/me" moet werken als er een [:space:] voor staat (ja, zover was ik al met regexp ;)). Hij kleurt dan vanaf daar tot het einde van de regel (tot 1e n of einde van string).



In mijn oplossing (zie boven in vet) moet je om die URL problemen te vermijden $pattern veranderen in

$pattern = "!(^|[ t])/me(.*)$!im";

edit:

en de tweede "haakjesinhoud" gebruiken natuurlijk...

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 14-09 12:05
<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>Op 27 september 2000 09:41 schreef LuCarD het volgende:
Waarom gebruik je unset?? variablen zijn weg zodra een script eindigt. En dan maakt hij ook weer het geheugen vrij. En al gooi je het in een functie is het vrij zodra de functie eindigt...[/quote]Macht der gewoonte. ;)

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 14-09 12:05
En dit is het uiteindelijke resultaat:<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>$pattern = "!(^|[ \t])/me(.*)$!im";
$replacement = "\\1<font color=\"$cfgFontMeColor\">* {USERNICKNAME} \\2</font>";
$text = preg_replace($pattern, $replacement, $text);[/quote]Arien, je bent een held. ;)

Heel erg bedankt allen!

PS: Let even op als je je berichtjes gaat editen. Hij haalt dan namelijk ALLE \ weg! :(

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 15-09 20:25

dominic

will code for food

response.write "<font bla>" & replace(strInp, "/me", strNick) & "</font>"

Download my music on SoundCloud


Verwijderd

En dit is het uiteindelijke resultaat
blabla...

$pattern = "!(^|[ \t])/me (.*)$!im";

Vergeet de spatie na / m e niet....

Verwijderd

response.write "<font bla>" & replace(strInp, "/me", strNick) & "</font>"

Nee.... Je gooit nu die tags rond de hele string waarin je / m e door iets hebt vervangen. Dat was de vraag niet.

  • Onno
  • Registratie: Juni 1999
  • Niet online
<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>response.write "<font bla>" & replace(strInp, "/me", strNick) & "</font>"[/quote]Argh nee... je wilt wel erg graag laten zien dat het met VBscript makkelijker kan he? ...

Wat jij nu doet is ALTIJD <font>..</font> om ALLE tekst heenzetten... en dat is dus NIET de bedoeling...

Verwijderd

Argh nee... je wilt wel erg graag laten zien dat het met VBscript makkelijker kan he? ...

Wat jij nu doet is ALTIJD <font>..</font> om ALLE tekst heenzetten... en dat is dus NIET de bedoeling...


En ook VBScript ondersteund RegExen...
Zal wel niet voor niets wezen.

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 14-09 12:05
<BLOCKQUOTE><font size=1 face=Verdana, Arial, Helvetica>quote:</font><HR>Op 27 september 2000 14:10 schreef Arien het volgende:
En dit is het uiteindelijke resultaat
blabla...

$pattern = "!(^|[ \t])/me (.*)$!im";

Vergeet de spatie na / m e niet....[/quote]Done :)

Verwijderd

dit stukje code heb ik getest, en het leverde totaal niks op:
code:
1
2
3
$pattern = "!(^|[ \t])/me (.*)$!im";
$replacement = "\\1<div class=me>* $NAAM \\2</div>";
$text = preg_replace($pattern, $replacement, $text );

(ik voer het gewoon uit wanneer ik de pagina weergeef, of moet ik dit voordat ik iets invoer op $text uitvoeren?)

  • Tom
  • Registratie: Juni 1999
  • Niet online

Tom

Tangle[..]> No offence: maar misschien is het beter eerst wat meer tutorials door te lezen, ik zag ook al een vraag staan over hoe je een while loopje maakte. Een while loopje is toch wel heel erg basic eigenlijk. En je opmerking hierboven over een stukje code uit te laten voeren op een lege string is ook niet echt slim te noemen. OK we zijn allemaal ooit begonnen :) maar als je wat meer tutorials leest heb je denk ik iets meer basis.

Verwijderd

Op donderdag 01 februari 2001 10:04 schreef Tom het volgende:
Tangle[..]> No offence: maar misschien is het beter eerst wat meer tutorials door te lezen, ik zag ook al een vraag staan over hoe je een while loopje maakte. Een while loopje is toch wel heel erg basic eigenlijk. En je opmerking hierboven over een stukje code uit te laten voeren op een lege string is ook niet echt slim te noemen. OK we zijn allemaal ooit begonnen :) maar als je wat meer tutorials leest heb je denk ik iets meer basis.
Tom je denkt verkeerd :)
ik voerde het dus echt niet uit op een lege string, ik had die ene spatie vergeten tussen / meen (.*)$!im, en over dat while loopje:
ik ging verder met de variabele BINNEN de loop, waardoor er een vaag getal uit kwam.....

Denk aub niet dat ik er weinig van af weet ook al komt dat soms zo over.......
please..... :)

Ik geef wel toe dat ik sommige basis mis, omdat ik in het begin php verkeerd heb aangeleerd, ik begon meteen met stukjes code te be'snuffelen' zonder tutorials te lezen...
dat ben ik de laatste tijd aan het inhalen...

Trouwens, om ff ontopic te blijven, het werkt nu dus wel, maar de zinnen na de / me zin zijn ook rood, hoe dit op te lossen?

Verwijderd

Wat een topics over / me zeg :)

Maaruh, neem nu gewoon dit stukkie dat gepost is in o.a. http://gathering.tweakers.net/forum/list_messages/117373 en vervang $text door je eigen $string en zorg ervoor dat $username iets leuks bevat :7

Als het dan niet goed werkt, ben ik wel benieuwd naar het waarom. Post dan even het stukje tekst dat je in je db insert en waarbij het fout gaat.


// Me function by Arien@gathering.tweakers.net
$expression = "!(^|[ \t])/me (.*)$!im";
$replacement = "\\1<font color='red'>* $username \\2</font>";
$text = preg_replace($expression, $replacement, $text);

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:25

Janoz

Moderator Devschuur®

!litemod

Als je slechts 1 zin wil kleuren, dan moet je de $ vervangen door (\n|\.).. maw .. niet doorgaan tot einde string, maar tot een newline of een punt...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Op donderdag 01 februari 2001 16:25 schreef Janoz het volgende:
Als je slechts 1 zin wil kleuren, dan moet je de $ vervangen door (\n|\.).. maw .. niet doorgaan tot einde string, maar tot een newline of een punt...
Zou je dat iets uitgebreider kunnen uitleggen?
Moet je $ uit $!im vervangen door een \n, of ergens anders?

Ik snap die $expression namelijk niet echt dus kom ik er zelf niet uit....

  • Blue-eagle
  • Registratie: September 2000
  • Niet online
In asp...
code:
1
2
nieuw = replace(nieuw,"[me]","<a class=""Me"">» "&USR("NickNaam")&" ")
nieuw = replace(nieuw,"[/me]","</a><a class=""Font3_x"">")

Tis zo simpel...

PHP weet ik nix van.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:25

Janoz

Moderator Devschuur®

!litemod

Op donderdag 01 februari 2001 18:35 schreef Blue-eagle het volgende:
In asp...
code:
1
2
nieuw = replace(nieuw,"[me]","<a class=""Me"">» "&USR("NickNaam")&" ")
nieuw = replace(nieuw,"[/me]","</a><a class=""Font3_x"">")

Tis zo simpel...

PHP weet ik nix van.
Ja leuk en aardig, maar met een simpele replace krijg je natuurlijk alleen maar dat de / me een ander kleurtje krijgt.. terwijl hier achter * Janoz alles rood is....

Dus zo simpel is dat nog niet...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op donderdag 01 februari 2001 18:35 schreef Blue-eagle het volgende:
In asp...
code:
1
2
nieuw = replace(nieuw,"[me]","<a class=""Me"">» "&USR("NickNaam")&" ")
nieuw = replace(nieuw,"[/me]","</a><a class=""Font3_x"">")

Tis zo simpel...

PHP weet ik nix van.
hierbij moet je zelf [/ me] intoetsen, en das niet leuk :(

in php gaat die net zo simpel hoor..

  • joepP
  • Registratie: Juni 1999
  • Niet online
ASP ondersteunt inderdaad RegExp, maar wel pas vanaf IIS 5 :( Helaas...

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
[Sorry, in de verkeerde tread gepost]

Spijt me ;(
Pagina: 1