PHP Regex Soru

5 Cevap php

PHP dosyaları {değişken} <?php echo $variable ?> gibi okuyan bir regex yapmak mümkün olurdu?

Teşekkürler

Remy

5 Cevap

PHP kılavuzu zaten sağlayan bir regular expression for variable names:

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

Sadece bu onu değiştirmek zorunda:

\{[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\}

Ve bitirdiniz.


Edit Örneğin bir değişimin aynı zamanda değişkenleri içeren bu tür olaylar bir basit sıralı Penggantian as Ross proposed, bazı istenmeyen davranışlara neden olabilir farkında olmalıdır.

Böylece daha iyi kodu ayrıştırmak gerekir ve ayrı ayrı bu değişkenleri değiştirin. Örnek:

$tokens = preg_split('/(\{[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i=1, $n=count($tokens); $i<$n; $i+=2) {
    $name = substr($tokens[$i], 1, -1);
    if (isset($variables[$name])) {
        $tokens[$i] = $variables[$name];
    } else {
        // Error: variable missing
    }
}
$string = implode('', $tokens);

Eğer bazı şablon değişken değiştirme yapmak için çalışıyoruz gibi geliyor ;)

Ben örneğin bir dizi, ilk değişkenleri toplama tavsiye ve sonra gibi bir şey kullanmak istiyorum:

// Variables are stored in $vars which is an array
foreach ($vars as $name => $value) {
    $str = str_replace('{' . $name . '}', $value, $str);
}

{Değil aslında bir cevap, ancak açıklama ihtiyacı}

Sorunuzu genişletmek olabilir? Eğer $ değişkenin içeriğini bir regex uygulamak isteyen var mı?

Aşağıdaki satırı global değişkeninin değeri ile string '{variable}' tüm tekrarlarını değiştirmek $variable olmalıdır:

$mystring = preg_replace_callback(
  '/\{([a-zA-Z][\w\d]+)\}/', 
  create_function('$matches', 'return $GLOBALS[$matches[1]];'), 
  $mystring);

Edit: kesin olası tüm PHP değişken isimlerini yakalamak için bamya tarafından belirtilen biri tarafından burada kullanılan regex değiştirin.

(in comments) i want to be able to type {variable} instead of <?php echo $variable ?>

Primitive approach: Aşağıdaki regex ikame yapma, preprocess dosyalarınızı harici bir program (örneğin, bir Python komut dosyası) kullanabilirsiniz:

"{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)}"

ile

"<?php echo $\g<1> ?>"

Better approach: sizin için otomatik olarak değişiklik yapmak için IDE veya kod editörü bir makro yazın.