[PHP] uitkomst preg_replace als key van array

Pagina: 1
Acties:

  • Mafioso
  • Registratie: November 2000
  • Laatst online: 19:58
De topic titel klinkt misschin beetje vaag, maar ander kreeg ik het niet omschreven. Ik zit al ff te puzzelen op dit probleem, en heb al overal gezocht.

Ik heb het volgende scriptje (ff weg gelaten wat nvt is):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
$color  = array ('white'    // 0
                ,'black'    // 1
                ,'#00007F'  // 2
                ,'#009300'  // 3
                ,'#FF0000'  // 4
                ,'#7F0000'  // 5
                ,'#9C009C'  // 6
                ,'#FC7F00'  // 7
                ,'#FFFF00'  // 8
                ,'#00FC00'  // 9
                ,'#009393'  //10
                ,'#00FFFF'  //11
                ,'#0000FC'  //12
                ,'#FF00FF'  //13
                ,'#7F7F7F'  //14
                ,'#D2D2D2'  //15
);

function replace($line) {
  global $color;
  $line = preg_replace("/".chr(02)."(.*?)".chr(02)."/","<b>\\1</b>",$line);
  $line = preg_replace("/".chr(03)."([0-9]{1,2})/","<font color=$color[\\1]>",$line);
  return $line;
}
?>

Maar dit gaat dus niet werken, het gaat mis bij $color[\\1] (logisch), maar hoe ik dit oplossen. Hoe krijg ik dus in die uitkomst "\\1" als key voor $color ?

Misschien een work-around ?, of kan het ook 'netjes'?

[edit]
Oja .. het kan dus meer dan 1 maal voorkomen dat in een regel die chr(03) voorkomt, anders hat het wel gekund met een preg_match:
PHP:
1
2
3
4
5
<?
if (preg_match("/".chr(03)."([0-9]{1,2})/",$line,$temp) {
  preg_replace("/".chr(03)."([0-9]{1,2})/","<font color=".$color[$temp[1]].">",$line);
}
?>

[edit2] ff wat lelijke typfouten weg gehaald.

  • tomato
  • Registratie: November 1999
  • Niet online
Kijk eens naar de /e modifier:
PHP:
1
2
3
4
5
<?
$p = '/'.chr(3).'([0-9]{1,2})/e';
$r = '"<font color=\\"$color[$1]\\">"';
$line = preg_replace($p, $r, $line);
?>

Die eerste is waarschijnlijk ook zo beter:
PHP:
1
2
3
4
5
<?
$p = '/'.chr(2).'([^'.chr(2).']*)/';
$r = '<b>$1</b>';
$line = preg_replace($p, $r, $line);
?>

HTH :)

  • Mafioso
  • Registratie: November 2000
  • Laatst online: 19:58
tss .. het werkt nog ook zeg .. Thx dude, you're my GoD ;)

Nu eens ff goed bekijken/leren wat hoe dat nou precies in z'n werk gaat

  • tomato
  • Registratie: November 1999
  • Niet online
De /e is van 'evaluate'. Dat betekent dat de replace string na iedere match ge-evalueerd wordt (dus uitgevoerd als ware het PHP code) en wat dat oplevert wordt als vervanging voor de match gebruikt.

Je kunt dit ook met preg_replace_callback() doen, maar waarom ze laatst die functie toegevoegd hebben is met niet helemaal duidelijk. Sowieso vind ik dat PCRE nogal brak geimplementeerd is in PHP, ik neig toch steeds weer naar perl constructies als ik er mee bezig ben. Maar het doet wat het moet doen, dus wat dat betreft ben je er mee geholpen :)

www.php.net/pcre
Of kijk wat perl regular expression tutorials door, ik ken eigenlijk geen goede voor PHP en het idee blijft hetzelfde (hoewel perl natuurlijk nog steeds veel cooler is, de /e modifier bijvoorbeeld kun je ook meerdere keren gebruiken >:)).

  • Mafioso
  • Registratie: November 2000
  • Laatst online: 19:58
hmm nog bedankt voor de uitleg .. ik had het al wel opgezocht, maar ik snapte r niet echt heel veel van, maar 1 zin oid + nog lastige engelse worden ook :)

tsja perl ken ik helemaal niet, maar ik heb wel eerder wat regular expressions, alleen dat lukte allemaal wel, deze wist ik niet :/

Weer wat geleerd :D