Regexplerin PHP ile birlikte Etiketler içerir değiştirilmesi

5 Cevap php

Ben, bir dize okumak bir {VAR} algılar, ve sonra {VAR} yerine bir file_get_contents ('VAR.php') yapmanız gerekir. "VAR" Ben ne VAR bilmek istemiyorum, vb TEST, ya da İLETİŞİM-FORMUNU gibi, bir şey adlandırılmış olabilir - kodlanmış bir durum yapmak için, ama sadece çevrili bir büyük alfanümerik etiketi görmek için değil sadece kaşlı ve yüklemek için () bir file_get_contents yapın.

Ben preg_match ve preg_replace kullanmanız gerekiyor biliyorum, ama ben bu konuda Regexplerin aracılığıyla tökezleyerek ediyorum.

Bu nasıl yararlıdır? Bu WordPress çengel yararlıdır.

5 Cevap

Orion üzerinde bir doğru çözümü vardır, ama bu basit bir durumda bir geri arama işlevini kullanmak için gerçekten gerekli değildir.

Dosya adları AZ + olduğunuzu varsayarak regex PHP'nin / e bayrağını kullanarak 1 hat yapabilirsiniz tire:

$str = preg_replace('/{([-A-Z]+)}/e', 'file_get_contents(\'$1.html\')', $str);

Bu VAR.html içeriğiyle {VAR} herhangi bir örneğini değiştiririz. Belirli bir dizin belirtmek gerekirse ikinci dönem içine bir yol öneki olabilir.

Orada yukarıda belirtildiği gibi aynı belirsiz güvenlik endişeleri vardır, ama ben özel bir şey düşünemiyorum.

Sen şeylerin bir dizi yapmak gerekir. Ben bir dizeye preprocess istediğiniz sayfa verilerini almak için ayak işi yapmak varsayarak yaşıyorum.

  1. Öncelikle, doğru maç için düzenli ifadeyi gerekir. İşte /{\w+}/ gibi bir şey ile oldukça kolay olmalıdır.

  2. Sonra sayfa veri ofset yerini almak için preg_match için tüm bayrakları kullanmak gerekir. Bu ofset sen önce, eşleştirme içine dize bölmek izin ve maç parça sonra olacaktır.

  3. Eğer 3 parça var sonra, sizin eklemek çalıştırmak için gereken ve bunları birlikte geri sokarım.

  4. Köpürtün, durulayın tekrarlayın.

  5. Eğer daha fazla değişkenleri bulmak zaman durdurun.

Bu korkunç verimli değildir, ve muhtemelen daha iyi yolları vardır. Sen /[{}]/ üzerinde bölme, yerine preg_split yaptığını düşünebilirsiniz. Olursa olsun dilim nasıl Eğer gelen veri güvenebilirsiniz olduğunu varsayıyoruz, ve bu tüm süreç çok basitleştirmek olur. Bunu yapmak için, ben şöyle bir kod ortaya koymak istiyorum:

  1. Içerik almak ve böylece gibi bölünmüş: $parts = preg_split('/[{}]/', $page_string);

  2. Aşağıdaki kriterlere parçalar üzerinde tekrarlamalı bir fonksiyon yazın:

    • Arg uzunluğu olduğunda Halt < 3
    • Else, oluşan yeni bir dizi döndürür
    • $ Arg [0]. load_data ($ arg [1]). $ Arg [2]
    • artı ne olursa olsun [... 3] $ argv kalır
  3. $ Parça üzerinde fonksiyonunu çalıştırın.

Kafamın üst kapalı, bunu istiyorum:

// load the "template" file
$input = file_get_contents($template_file_name);

// define a callback. Each time the regex matches something, it will call this function.
// whatever this function returns will be inserted as the replacement
function replaceCallback($matches){
  // match zero will be the entire match - eg {FOO}. 
  // match 1 will be just the bits inside the curly braces because of the grouping parens in the regex - eg FOO
  // convert it to lowercase and append ".html", so you're loading foo.html

  // then return the contents of that file.
  // BEWARE. GIANT MASSIVE SECURITY HOLES ABOUND. DO NOT DO THIS
  return file_get_contents( strtolower($matches[1]) . ".html" );
};
// run the actual replace method giving it our pattern, the callback, and the input file contents
$output = preg_replace_callback("\{([-A-Z]+)\}", replaceCallback, $input);

// todo: print the output

Now I'll explain the regex

 \{([-A-Z]+)\}
  • \{ ve \} sadece kaşlı ayraçlar maç için bunu söylemek. Sen { ve } özel karakterler gibi eğik, ihtiyaç, bu yüzden kaçan gerekir.
  • ( ve ) gruplandırma oluşturmak. Temelde bu maçın belirli bölümlerini ayıklamak sağlar. Ben sadece parantezi kendilerini eşleşen olmadan, parantezi içindeki şeyleri maç için yukarıdaki fonksiyonda kullanın. Ben yapmadım, o zaman ben { şerit gerekiyordu ve } maç dışında, hangi can sıkıcı olurdu
  • [-A-Z] "herhangi bir harf karakteri eşleştirmek veya bir - diyor
  • + sonra [-A-Z] en az 1 karakter olması gerekiyor anlamına gelir, ama biz herhangi bir numaraya kadar olabilir.

Sen, (Allah korusun) regexes olmadan böyle bir şey yapabilirsiniz:

//return true if $str ends with $sub
function endsWith($str,$sub) {
    return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
}

$theStringWithVars = "blah.php cool.php awesome.php";
$sub = '.php';
$splitStr = split(" ", $theStringWithVars);
for($i=0;$i<count($splitStr);$i++) {
    if(endsWith(trim($splitStr[$i]),$sub)) {
        //file_get_contents($splitStr[$i]) etc...
    }    
}

Nispeten konuşma, düzenli ifade pahalıdır. Yüklemek için dosyaları anlamaya ihtiyacınız olsa da, kesinlikle değiştirme yapıyor için onlara ihtiyacımız yok, ve muhtemelen normal ifadeler kullanmak gerekir. Tüm bunlardan sonra, size bulanık arama ihtiyacım var neden bu kadar yerini tam olarak ne biliyor musun?

Lütfen değiştirmeleri yapmak için bir ilişkisel dizi ve str_replace kullanabilirsiniz. str_replace seferde birden fazla değişiklik yapmadan diziler destekler. Bir satır ikame, hiçbir döngüler.

Örneğin:

$substitutions = array('{VAR}'=>file_get_contents('VAR.php'),
'{TEST}'=>file_get_contents('TEST.php'),
...
);

$outputContents = str_replace( array_keys($substitutions), $substitutions, $outputContents);