PHP preg_replace_callback için regex

2 Cevap php

Düzenli ifadeler sadece benim bir şey değil. (

Ben gibi birden fazla alt dizeleri içerebilir bir dize var:

[var1="111" var2="222" var3="222" var4="444"]

Ben temelde her değişkeni alır bir işlevin sonuçları ile her tekrarlamasını değiştirmek gerekiyor.

$string = '[var1="111" var2="222" var3="333" var4="444"]';    
$regex = 'var1="(.*)" var2="(.*)" var3="(.*)" var4="(.*)"';

function doit($matches){
    return "<strong>".implode(", ", $matches) ."</strong>";
}

echo preg_replace_callback($regex,'doit',$string);

Ben bekliyordum 111, 222, 333, 444.

Ama ben aşkı hissetmiyorum. Herhangi bir yardım mutluluk duyacağız!

Edit: some clarification..

Ben soru uğruna basitleştirilmesi edildi.

  1. the "vars" will not really be called "var1", "var2" more like [recID="22" template="theName" option="some value", type="list"]

  2. the call back would be more complicated then my simple implode... I would use "id" and connect to a database, get the records and insert them into the template... Hence the need for the call back...

  3. matched values could be almost anything, not just numbers.

2 Cevap

İki adımda bunu:

  1. Etiketlerini alın
  2. Her etiket için özelliklerini alın

İşte bir örnek:

function doit($match) {
    $parts = preg_split('/(\w+="[^"]*")/', $match[1], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    foreach ($parts as $part) {
        if (trim($part) !== "") {
            if (!preg_match('/^(\w+)="([^"]*)"$/', $part, $match)) {
                // syntax error
            } else {
                var_dump($match);
            }
        }
    }
}

$str = '[var1="111" var2="222" var3="333" var4="444"]';
$re = '/\[((?:[^"[\]]+|"[^"]*")*)]/';
preg_replace_callback($re, 'doit', $str);

Bu ile bile sözdizimi hatalarını algılayabilir.

O karakteri giriş karakteri okumak ve onlar içeri bulunan bağlamlara bağlı belirteçleri belirlemek için daha verimli olurdu gibi mükemmel bir çözüm değil

Diğer sorunun cevabı daha iyi bir çözüm olabilir, ama burada preg_replace_callback ile bunu yapabileceğini nasıl olabilir:

$string = '[var1="111" var2="222" var3="333" var4="444"]';

// Note: regular expressions need to start and end with /
$regex = '/var1="(.*)" var2="(.*)" var3="(.*)" var4="(.*)"/';

function doit($matches){
    // The first element of matches is the complete
    // match, shift is here just to get rid of it
    // (probably a better way to do this)
    array_shift($matches);
    return "<strong>".implode(", ", $matches) ."</strong>";
}
echo preg_replace_callback($regex,'doit',$string);