Ne regex ben kullanmanız gerekir?

3 Cevap php

I'm writing an application in PHP, and I need to replace any word between <!-- * and * --> with it's correspondenting element in $vars. For example,

<!-- *foobar* -->

Bu durumda, 'filanca' değişken $vars["foobar"] 'nin değeri ile değiştirilmesi gerekir. Bu ne var şimdi, ama çalışmak (her zaman döndürür <> değil: ():

preg_replace_callback("<!--(\s+)\*([a-zA-Z0-9]+)\*(\s+)-->", create_function('$matches', 'return $vars[$matches];'), $template);

Herkes bana yardımcı olabilir misiniz? Şimdiden teşekkürler.

3 Cevap

Eğer küresel anahtar kelime ile veya $ GLOBALS kullanarak tanıtmaktır olmadan $ değişkenler kullanamazsınız unutmayın. PHP 5.3 çalıştırıyorsanız eğer Ayrıca, çirkin bir küresel kesmek olmadan bir anonim işlevini kullanabilirsiniz:

$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', function($matches) use ($vars) { return $vars[$matches[1]]; }, $template);

Önceden 5.3 bunu yapabilirsiniz:

$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', create_function('$matches', 'return $GLOBALS["vars"][$matches[1]];'), $template);

Eğer 5.3 çalıştırmak ancak global değişkeni kaçınmak istemiyorsanız, bunu yapabilirsiniz:

$template = preg_replace('/<!--\s+\*(\w+)\*\s+-->/e', '$vars["\1"]', $template);

Deneyin:

create_function('$matches', 'return $vars[$matches[2]];')

ikinci grup istediğiniz biri olduğu. Değil emin niçin sen ancak diğerlerini yakalama ediyoruz. Ayrıca bu tür bir şey için ben oldukça aramadan daha küresel bir tercih eğilimi create_function().

Ayrıca, / bu versiyonu gibi, regex sınırlayan değil:

$vars = array(...);
preg_replace_callback('/<!--\s+\*([a-zA-Z0-9]+)\*\s+-->/', 'replace_var', $template);

function replace_var($matches) {
  global $vars;
  return $vars[$matches[1]];
}

Ben sana ne gerek düşünüyorum:

preg_replace_callback("/<!--\s+\*([a-zA-Z0-9]+)\*\s+-->/", create_function('$matches', 'return $vars[$matches[2]];'), $template);

$ Değişken bir dizidir eşleşir. Endeks 0 bütün regex eşleşen ve ardından başka indeksler regex yakalama grupları (varsa) ne olduğunu.

Bu durumda $ maçı bu gibi görünecektir:

array(2) {
  [0]=>
  string(18) "<!-- *example* -->"
  [1]=>
  string(7) "example"
}