Domanda

Non ho testo come questo da software di poker (ho evidenziato le parti che ho bisogno di sostituire).

  

--- --- FLOP [Jh 9h Ah]
  driverseati controlli
  Darrington ha 15 secondi dalla fine di agire
  Darrington scommette 100 |   InvisibleEnigma chiama 100 |   driverseati pieghe
  --- --- TURNO [Jh 9h Ah] [3c]
  Darrington scommette 200
  InvisibleEnigma chiama 200
  --- --- RIVER [Jh 9h Ah 3c] [Td]

     

Jh = Jack di cuori
  9h = 9 di cuori
  Ah = asso di cuori
  3c = 3 di club

Voglio sostituire le carte all'interno delle parentesi quadre con IMMAGINI .

Quindi questa linea: --- --- TURNO [Jh 9h Ah] [3c]
Deve diventare: --- --- TURNO jh.gif 9h.gif ah.gif 3c.gif

Non riesco a capire il preg_replace :( posso sorta di figura fuori per una sola carta di parentesi (come il [3c]), ma mi sono bloccato a sostituire più istanze su 1 linea e alcune staffe avere 3 carte e alcune staffe con 2 o 1 carta.

Questo è quello che ho per una singola carta:

\[([AKQJakqj1-9]0?[DHSCdhsc])\]

Qualsiasi aiuto sarebbe apprezzato.

È stato utile?

Soluzione

E 'difficile da fare se siete alla ricerca per le parentesi quadre (come si sta trovando fuori). Se non si cerca di far corrispondere loro e basta guardare i nomi di carte, ovunque si verifichino, allora è un gioco da ragazzi:

\b([AKQJakqj1-9]0?[DHSCdhsc])\b

I marcatori \b verificare la presenza di confini di parola. Essi assicurano che il nome della scheda deve essere una parola distinta, così Ah in Ahead non corrisponderà, per esempio.

Movimentazione le parentesi quadre piuttosto complicato. Idealmente si potrebbe usare lookahead e lookbehind affermazioni per verificare la presenza di loro , ma c'è una sfortunata restrizione affermazioni lookbehind che li rende inadatti per il lavoro:

  

Il contenuto di un'asserzione lookbehind sono limitati in modo tale che tutte le corde che corrisponde devono avere una lunghezza fissa.

Così, invece mi si avvicinò con una soluzione a doppia sostituzione utilizzando il flag /e per nidificare un preg_replace chiamata all'interno di un altro.

preg_replace(
    '/\[(.*?)]/e',
    "preg_replace('/(\b[AKQJT1-9]0?[DHSC]\b)/i', '\\\$1.jpg', '$1')",
    $hh
);

L'aspetto regex esterni per le parentesi quadre e cattura gli interni. L'aspetto regex interni per i nomi di carte all'interno di quel $1 e li trasforma in immagini.

A proposito, ho aggiunto T per il vostro modello dal 10 ? è tipicamente scritto come Td nella storia delle mani, e ho aggiunto la bandiera i per rendere le ricerche case-insensitive.

Altri suggerimenti

function imageize($matches)
{
    $from = array('s','c','d','h','[',']');
    $to = array('s.gif','c.gif','d.gif','h.gif','','');
    return $matches[1] . str_replace($from, $to, strtolower($matches[2])) . $matches[3];
}

$str = preg_replace_callback('#([^\[\]]*?)((?: *\[[akqjtcsdh\d ]+\])+)([^\[\]]*?)#i', 'imageize', $str);
$string = "--- RIVER --- [Jh 9h Ah 3c] [Td]";

$CARD = "[akqjt1-9][dhsc]";
echo preg_replace(
  "/\[($CARD(?:\s+$CARD){0,4})\]/ie",
  "preg_replace('/\b$CARD\b/i', '\\\$0.gif', '\$1')",
  $string);

Questa uscite di codice:

--- RIVER --- Jh.gif 9h.gif Ah.gif 3c.gif Td.gif


Looks come John (!) Per poco mi hanno picchiato a esso mentre ho inciso via, anche se il mio codice qui è un po 'più specifica - non verrà eseguito la sostituzione su qualsiasi stringa tra parentesi, come [as the world turns], deve essere un set di carte . Ho anche limitato a 5 carte tra parentesi, anche se si potrebbe cambiare questo semplicemente regolando il {0,4} nella partita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top