2015-11-05 12 views
5

Mam wiele ciągów. Kilka przykładów pokazano poniżej:Wyrażenia regularne zastępujące {{a, b}} i {{a}}

  1. To jest mój pierwszy przykładowy ciąg znaków. {{1}} Tak właśnie wygląda.
  2. To jest mój drugi przykładowy ciąg. {{1,2}}. Tak to wygląda.
  3. To jest mój trzeci przykładowy ciąg. {{1,3}} i {{2}}. Tak to wygląda.

Mój kod musi zastąpić każdy żeton, który wygląda jak {{1}} z <input name="var1">

Należy również wymienić każdy żeton, który wygląda jak {{1,2}} z <input name="var1" value="2">

Zasadniczo, każdy żeton, który wygląda jak {{a}} potrzeb do zastąpienia przez <input name="vara"> i każdy token, który wygląda jak {{a,b}} z <input name="vara" value="b">

Jestem nami ing php.

Jaki byłby najlepszy sposób na zrobienie tego. Będzie wiele "żetonów" do zastąpienia w każdym ciągu. I każdy ciąg może mieć tokeny obu stylów.

Teraz mój kod wygląda następująco:

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

Ale to oczywiście nie jest bardzo wydajny, odkąd przechodzić szuka meczów. I oczywiście, nie jestem nawet dopasowując znaki, które wyglądają jak {{1,2}}

+0

Wow, niezły wymóg. Jak to rozwiążesz? – Tushar

+0

proszę wyjaśnić swoje wymagania jaśniej –

+0

Szukam skutecznego sposobu na zastąpienie tokenów w formacie {{a, b}} i {{a}} w ciągu znaków za pomocą php. Gdzie a i b są liczbami całkowitymi –

Odpowiedz

1

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

Regex Explanation and Live Demo

  1. \{: Zapałki { dosłownie, trzeba uciekać jak to jest specjalny symbol w regex
  2. (\d+): Dopasowuje jedną lub więcej cyfr, przechwyconych w grupie 1
  3. (,(\d+))? : Zgodny z jednym lub więcej cyfr następnie przecinkiem ewentualnie
  4. \}: Zapałki } dosłownie

$1 i $3 stosowane są zastąpienia, aby pierwszy i trzeci przechwycony grupy odpowiednio.

Przykład Kod Zastosowanie:

$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

Ten zamiennik ustawi atrybut "wartość" z pustą wartością. Myślę, że rozwiązanie 'preg_replace_callback' jest bardziej opłacalne w tym kontekście. –

+0

@stribizhev Right! Nie można dodać teraz, ponieważ został dodany jako kolejna [odpowiedź] (http://stackoverflow.com/a/33539371/2025923) – Tushar

1

Musisz użyć callback:

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

Zobacz demo at eval.in

regex {{([^},]+)(?:,([^}]+))?}} może być sądzony w regex101.Klasa z negacją [^},] dopasowuje znaki, które nie są ani } ani ,. + jeden lub więcej. Druga część (?:,([^}]+))? jest opcjonalna.

0

możesz użyć str_replace, aby uzyskać numer.

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

wyjście $ str:

$str = '12,13'; 

następnie użyj $arr = explode(',', $str) można uzyskać dwie liczby: 12 and 13

więc <input>. po prostu użyj $arr[0], aby wypełnić name i $arr[1], aby wypełnić value. wszystkie kody:

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