2015-11-05 12 views
5

Ich habe viele Zeichenfolgen. Einige Beispiele sind unten gezeigt:Reguläre Ausdrücke zu ersetzen {{a, b}} und {{a}}

  1. Dies ist meine erste Beispielzeichenfolge. {{1}} So sieht es aus.
  2. Dies ist meine zweite Beispielzeichenfolge. {1,2}}. So sieht es aus.
  3. Dies ist meine dritte Beispielzeichenfolge. {{1,3}} und {{2}}. So sieht es aus.

Mein Code muss jedes Token ersetzen, die mit <input name="var1">

wie {{1}} aussieht Es muss auch jedes Token ersetzen, die mit <input name="var1" value="2">

Im Allgemeinen jedes Token, das {{a}} Bedürfnisse wie {{1,2}} aussieht aussieht mit <input name="vara"> ersetzt werden und jedes Token, das aussieht wie {{a,b}} mit <input name="vara" value="b">

Ich bin uns php.

Was wäre der beste Weg, dies zu tun. Es wird viele "Tokens" geben, die in jeder Zeichenfolge ersetzt werden müssen. Und jede Zeichenfolge kann Token beider Stile enthalten.

Im Moment sieht mein Code wie folgt aus:

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); 
} 

Aber das ist natürlich nicht sehr effizient, da fahre ich durch Übereinstimmungen suchen. Und natürlich bin ich passend nicht einmal die Token, die wie folgt aussehen {{1,2}}

+0

Wow, nette Anforderung. Wie wirst du es lösen? – Tushar

+0

Bitte erläutern Sie Ihre Anforderungen klarer –

+0

Ich bin auf der Suche nach einer effizienten Möglichkeit, Tokens des Formats {{a, b}} und {{a}} in einer Zeichenfolge mit PHP zu ersetzen. Wo a und b sind ganze Zahlen –

Antwort

1

Verwenden regex \{\{(\d+)(,(\d+))?\}\}

Regex Explanation and Live Demo

  1. \{: Abgleichungen { wahrsten Sinne des Wortes, müssen zu entkommen, wie es besonderes Symbol ist in regex
  2. (\d+): Entspricht einer oder mehreren Ziffern, erfasst in Gruppe 1
  3. (,(\d+))? Spiele einer oder mehr Ziffern durch Komma gefolgt optional
  4. \}: Spiele } buchstäblich

$1 und $3 im Ersatz verwendet werden, die jeweils die erste und dritten erfassten Gruppe zu erhalten.

Beispielcode Verbrauch:

$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

Diese Ersetzung setzt das Attribut "Wert" mit einem leeren Wert. Ich denke, dass die 'preg_replace_callback'-Lösung in diesem Kontext praktikabler ist. –

+0

@stribizhev Richtig! Kann jetzt nicht hinzugefügt werden, da es als weiteres hinzugefügt wurde [Antwort] (http://stackoverflow.com/a/33539371/2025923) – Tushar

1

Sie benötigen ein callback verwenden: {{([^},]+)(?:,([^}]+))?}} können regex101 versucht werden

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

Siehe demo at eval.in

Die Regex.Negierte Klasse [^},] entspricht Zeichen, die weder } noch , sind. + ein oder mehr. Der zweite Teil (?:,([^}]+))? ist optional.

0

können Sie str_replace verwenden, um die Nummer zu erhalten.

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

Ausgang $ str:

$str = '12,13'; 

dann verwenden $arr = explode(',', $str), können Sie die zwei Nummer erhalten: 12 and 13

so die <input>. Verwenden Sie einfach $arr[0], um name und $arr[1] auszufüllen, um value auszufüllen. Alle Codes:

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