[RegExp] Color coding Call of Duty namen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • amoen
  • Registratie: Juni 2003
  • Laatst online: 30-06 22:13
Ik geef het meteen toe, reguliere expressies zijn voor 90% chinees voor me, vandaar dat ik er ook niet uitkom.
Simpele matches snap ik nog wel, maar dit gaat me even te ver. Ik probeer vanalles met behulp van http://gskinner.com/RegExr/ maar tevergeefs

Ik wil graag GamerTags van Call of Duty mooie kleurcodes geven.
Na een zoektocht op google kon ik geen standaard script vinden dat dit netjes met een reguliere expressie doet.
Dit script doet wat ik wil (zie de functie colorize), maar ik ben eigenwijs en denk dat het mooier kan :)

voorbeeldnamen:
code:
1
2
^1Game^2Koning
^3Shoot^42^5Kill


Nu wil ik graag alles matchen wat begint met \^[0-9] en loopt tot (maar niet inclusief) een andere \^ of het einde van de string

Nu heb ik de lookahead (?=\^), dus tot aan een nieuwe groep, maar de lookahead tot aan het einde van de string werkt niet.

Daarnaast wilt de groep tot aan de volgende match ook niet lekker lopen.
Ik heb de volgende regexes geprobeerd:
code:
1
2
3
\^[0-9](\w+)(?=\^)
\^[0-9](.*)(?=\^)
\^[0-9](\w+|\W+)(?=\^)

Maar geen van allen doet het precies goed

Uiteindelijk wil ik straks graag iets doen waardoor ik dit krijg
HTML:
1
2
<span class="color1">Game</span><span class="color2">Koning</span>
<span class="color3">Shoot</span><span class="color4">2</span><span class="color5">Kill</span>

heeeeee ..... hoe is het?


Acties:
  • 0 Henk 'm!

Verwijderd

Je gebruikt PHP? Ik zou niet weten waarom je dit zou willen doen met regexen :), doe gewoon lekker makkelijk, split op de ^ of misschien een \^\d+ regex, maar vervolgens zou ik gewoon de rest lekker doen met de andere string functies.

Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Dat heb je nu al :)
amoen schreef op zaterdag 13 augustus 2011 @ 19:52:
.. en loopt tot (maar niet inclusief) een andere \^ of het einde van de string.
code:
1
[^^]*


Voor de rest kun je dan met preg_match_all alle stukken ophalen die matchen met de regex. In dat geval hoef je geen ingewikkelde regex te schrijven om ook herhalingen te ondersteunen (om het simpel te houden). Met nog wat ronde haken (parentheses) kun je groepen maken om de informatie eenvoudiger benaderbaar te maken. Een mogelijk voorbeeld:

PHP:
1
2
3
4
preg_match_all("/\^([0-9])([^^]*)/", "^1Game^2Koning", $matches, PREG_SET_ORDER);
foreach ($matches as $val) {
    echo '<span class="color' . $val[1] . '">' . $val[2] . '</span>';
}

Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Waarom explode() je niet gewoon op '^' of iets dergelijks? Je loopt dan door de resultarray, pakt het eerste karakter van de string ($string[0]). En gooit er spans met de juiste kleur om heen en voegt het geheel toe aan de resultstring ( .=). Regex is hier (zoals in heel veel gevallen) echt grote onzin.

Dit dus ongeveer (pseudo-code):
PHP:
1
2
3
4
5
6
7
$string = "^1Foo^7Bar";
$array = explode('^', $string);
foreach($array as $value) {
   $color = (int) $value[0];
   $result .= '<span class="c'.$color.'">'.substr($value,1)."</span>";
}
echo $result;


Noot 1: Die 'c' in de class is trouwens omdat klassenamen niet met cijfers mogen beginnen wil het geheel
valideren.
Noot 2: Als je een charset gebruikt waarbij een karakter meer dan 1 byte (dus o.a. UTF-8) in beslag kan nemen moet je het multibyte equivalent van substr gebruiken (mb_substr() geloof ik).

Bovenstaande werkt trouwens alleen als de kleuren niet genest kunnen worden. Maar volgens mij heb jij het over het color taggen in de Quake 3 engine en daar kon AFAIK niet genest worden.

[ Voor 33% gewijzigd door bindsa op 13-08-2011 20:59 ]


Acties:
  • 0 Henk 'm!

  • amoen
  • Registratie: Juni 2003
  • Laatst online: 30-06 22:13
Bedankt mensen!

Ja de php oplossing van Lassche had ik ongeveer zelf ook al :Y) Sorry voor je moeite, dat had ik erbij kunnen zetten in mijn eerste post. Maar ik wilde nu eenmaal heel graag een regex oplossing hebben, of dit nu handiger is of niet, het is voor mij ook weer iets om van te leren!

Die van Feanathiel werkt iig zoals ik hem wil hebben!
Erg bedankt allen!

Uiteindelijk is dit mijn functie:
PHP:
1
2
3
4
5
6
7
8
function setNameColors($name)
{
    preg_match_all("/\^([0-9])([^^]*)/", $name, $matches, PREG_SET_ORDER); 
    foreach ($matches as $str) { 
        $name = str_replace('^'.$str[1].$str[2], '<span class="color'.$str[1].'">'.$str[2].'</span>', $name); 
    }
    return $name;
}

Ik had gehoopt het zonder str_replace te kunnen, maar dat komt wellicht nog wel.

heeeeee ..... hoe is het?


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
amoen schreef op zaterdag 13 augustus 2011 @ 22:08:
Bedankt mensen!

Ja de php oplossing van Lassche had ik ongeveer zelf ook al :Y) Sorry voor je moeite, dat had ik erbij kunnen zetten in mijn eerste post. Maar ik wilde nu eenmaal heel graag een regex oplossing hebben, of dit nu handiger is of niet, het is voor mij ook weer iets om van te leren!

Die van Feanathiel werkt iig zoals ik hem wil hebben!
Erg bedankt allen!

Uiteindelijk is dit mijn functie:
PHP:
1
2
3
4
5
6
7
8
function setNameColors($name)
{
    preg_match_all("/\^([0-9])([^^]*)/", $name, $matches, PREG_SET_ORDER); 
    foreach ($matches as $str) { 
        $name = str_replace('^'.$str[1].$str[2], '<span class="color'.$str[1].'">'.$str[2].'</span>', $name); 
    }
    return $name;
}

Ik had gehoopt het zonder str_replace te kunnen, maar dat komt wellicht nog wel.
http://php.net/preg_replace

Acties:
  • 0 Henk 'm!

  • amoen
  • Registratie: Juni 2003
  • Laatst online: 30-06 22:13
wow, nog minder code, dat is precies wat ik wilde!
PHP:
1
2
3
4
function setNameColors($name)
{
    return preg_replace("/\^([0-9])([^^]*)/", '<span class="color${1}">${2}</span>', $name);
}

heeeeee ..... hoe is het?


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
amoen schreef op zondag 14 augustus 2011 @ 13:36:
[...]


wow, nog minder code, dat is precies wat ik wilde!
PHP:
1
2
3
4
function setNameColors($name)
{
    return preg_replace("/\^([0-9])([^^]*)/", '<span class="color${1}">${2}</span>', $name);
}
Onderaan de documentatie van de meeste PHP functies staat een 'See also' paragraaf, die is vaak wel de moeite waard om door te kijken, dan kom je nog eens wat nieuws tegen. Zo weet het gros van de PHP-ers bijvoorbeeld niet eens van het bestaan van functies als filter_var().

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

T.H. Lassche schreef op zondag 14 augustus 2011 @ 13:39:
[...]

Onderaan de documentatie van de meeste PHP functies staat een 'See also' paragraaf, die is vaak wel de moeite waard om door te kijken, dan kom je nog eens wat nieuws tegen. Zo weet het gros (;)) van de PHP-ers bijvoorbeeld niet eens van het bestaan van functies als filter_var().
Je moet alleen wel stoppen met lezen na de "See Also"-entries. Dat commentaar... 8)7
sampathperera at hotmail dot com 03-Aug-2011 05:36
PHP FILTER_VALIDATE_EMAIL validates with no TLD

<?php
var_dump(filter_var('bob@example', FILTER_VALIDATE_EMAIL));
?>

Output bool(false) expected.

But it returns: string(11) "bob@example"
Oh?
PHP:
1
2
3
4
5
6
7
8
<pre>
<?
$input = array('bob@example', 'bob@foo.bar');

foreach ($input as $i)
{
    var_dump(filter_var($i, FILTER_VALIDATE_EMAIL));
}

bool(false)
string(11) "bob@foo.bar"


Edit: en dan doe ik het zelf ook nog fout. Het gaat bij mij dus goed op PHP versie 5.3.5 en
Input Validation and Filtering enabled, Revision $Revision: 298196 $.

[ Voor 7% gewijzigd door CodeCaster op 14-08-2011 14:13 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
CodeCaster schreef op zondag 14 augustus 2011 @ 13:50:
[...]

Je moet alleen wel stoppen met lezen na de "See Also"-entries. Dat commentaar... 8)7


[...]

Oh?
PHP:
1
2
3
4
5
6
7
8
<pre>
<?
$input = array('bob@example', 'bob@foo.bar');

foreach ($input as $i)
{
    var_dump(filter_var($i, FILTER_VALIDATE_EMAIL));
}

bool(false)
string(11) "bob@foo.bar"
100% Gelijk ;)
Het zou de eerste keer niet zijn dat je iets leest als 'use thiz function to check all your post vars so you don't have to strip anymore'
Of: 'I don't use frameworks I write my own, less overhead less bugs, 100% safe.'

De soms zeer naïeve houding van programmeurs is echt dodelijk.

[ Voor 10% gewijzigd door bindsa op 14-08-2011 14:08 ]

Pagina: 1