2015-11-05 21 views
5

Ho molte stringhe. Alcuni esempi sono mostrati di seguito:Espressioni regolari per sostituire {{a, b}} e {{a}}

  1. Questa è la mia prima stringa di esempio. {{1}} Ecco come appare.
  2. Questa è la mia seconda stringa di esempio. {{1,2}}. Questo è quello che sembra.
  3. Questa è la mia terza stringa di esempio. {{1,3}} e {{2}}. Questo è quello che sembra.

Il mio codice deve sostituire ogni token che assomiglia {{1}} con <input name="var1">

Ha anche bisogno di sostituire ogni token che assomiglia {{1,2}} con <input name="var1" value="2">

In generale, ogni token che assomiglia {{a}} esigenze da sostituire con <input name="vara"> e ogni token che assomiglia a {{a,b}} con <input name="vara" value="b">

I am us ing php.

Quale sarebbe il modo migliore per farlo. Ci saranno molti "token" da sostituire all'interno di ogni stringa. E ogni stringa può avere token di entrambi gli stili.

In questo momento, il mio codice simile a questo:

for ($y = 1; $y < Config::get('constants.max_input_variables'); $y++) { 
    $main_body = str_replace("{{" . $y . "}}", "<input size=\"5\" class=\"question-input\" type=\"text\" name=\"var" . $y . "\" value=\"".old('var'.$y)."\" >", $main_body); 
} 

ma questo non è ovviamente molto efficiente da quando ho scorrere alla ricerca di corrispondenze. E naturalmente, non sto nemmeno corrispondenti ai gettoni che assomigliano {{1,2}}

+0

Wow, bel requisito. Come lo risolverete? – Tushar

+0

per favore spiega più chiaramente le tue esigenze –

+0

Sto cercando un modo efficiente per sostituire i token del formato {{a, b}} e {{a}} in una stringa usando php. Dove aeb sono interi –

risposta

1

Usa espressione regolare \{\{(\d+)(,(\d+))?\}\}

Regex Explanation and Live Demo

  1. \{: partite { letteralmente, necessità di fuggire in quanto è simbolo speciale in regex
  2. (\d+): corrisponde a una o più cifre, catturate nel gruppo 1
  3. (,(\d+))? : Corrisponde a una o più cifre seguite da virgola facoltativamente
  4. \}: partite } letteralmente

$1 e $3 sono utilizzati nella sostituzione per ottenere il primo ed il terzo gruppo acquisito rispettivamente.

Codice Esempio di utilizzo:

$re = "/\\{\\{(\\d+)(,(\\d+))?\\}\\}/mi"; 
$str = "This is my first example string. {{1}} This is what it looks like.\nThis is my second example string. {{1,2}}. This is what it looks like.\nThis is my third example string. {{1,3}} and {{2}}. This is what it looks like."; 
$subst = "<input name=\"var$1\" value=\"$3\" />"; 

$result = preg_replace($re, $subst, $str); 
+1

Questa sostituzione imposterà l'attributo 'value' con un valore vuoto. Penso che la soluzione 'preg_replace_callback' sia più valida in questo contesto. –

+0

@stribizhev Giusto! Impossibile aggiungere ora poiché è stato aggiunto come un altro [risposta] (http://stackoverflow.com/a/33539371/2025923) – Tushar

1

È necessario utilizzare un callback:

$str = preg_replace_callback('/{{([^},]+)(?:,([^}]+))?}}/', function($_) { 
    return '<input name="var'.$_[1].'"' . (isset($_[2]) ? ' value="'.$_[2]. '"' : '') . '>'; 
}, $str); 

Vedi demo at eval.in

La regex {{([^},]+)(?:,([^}]+))?}} può essere provato in regex101.La classe negata [^},] corrisponde a caratteri che né },. + uno o più. La seconda parte (?:,([^}]+))? è facoltativa.

0

è possibile utilizzare str_replace per ottenere il numero.

$str = str_replace(array('{{', '}}'), '' , '{{12,13}}'); 

uscita $ str:

$str = '12,13'; 

quindi, utilizzare $arr = explode(',', $str), è possibile ottenere il numero di due: 12 and 13

in modo che il <input>. è sufficiente utilizzare $arr[0] per inserire name e $arr[1] per inserire value. tutti i codici:

$str = str_replace(array('{{', '}}'), '' , '{{12,13}}'); 
$arr = explode(',', str); 
return '<input name="var'.$arr[0].'" value="'.$arr[1].'" />'; 
Problemi correlati