preg_replace Desen

4 Cevap php

Ben preg_replace ile çok sağlam değilim - diğer bir deyişle ben gerçekten anlamıyorum - bu yüzden bana yardımcı olabilir umuyoruz.

Ben böyle bir Metin bir dizesi vardır: [demo category=1] ve Kategori İçeriği (id = 1), örneğin ile değiştirmek istiyor "{[(1)"}]

This is my startpoint Pattern - that's all i have: '/[demo\s*.*?]/i';

Eğer yardımcı olabilir umuyoruz?

4 Cevap

Öncelikle, onlar PCREs özel karakterler gibi köşeli parantez kaçmak gerekir:

'/\[demo\s*.*?\]/i';

İkincisi, sonunda rakam ile bir şeyler yapmak istiyorum gibi geliyor, bu yüzden parantez kullanarak yakalamak istersiniz:

'/\[demo\s*.*?=(\d+)\]/i';

Ayraçları \d+ çekeceği ve bir referans saklamak. \d+ sadece rakamlardan oluşan bir dize maç olacak.

Istediğiniz dizeyi almak için maçlara özel bir işlevi gerçekleştirmek için preg_replace_callback kullanmak gerekir gibi nihayet geliyor:

function replaceMyStr($matches)
{
    $strNum = array("1"=>"first", "2"=>"second", "3"=>"third"); // ...etc
    return "This is the Content of my ".$strNum($matches[1])." Category.";
    // $matches[1] will contain the captured number
}
preg_replace_callback('/\[demo\s*.*?=(\d+)\]/i', "replaceMyStr", "[demo category=1]");

ayrıca yukarıdaki cevaplar, sen yerine gerçek yapmak için 2 yol var. 10 kategveyai adlarını değiştirmek istediğiniz varsayarak, senin gibi bir şey ya

fveya ($i = 1; $i <= $max_categveyay; $i++) {
 $categveyay_name = get_categveyay_name($i);
 $s = preg_replace("/\[demo\s+categveyay=(\d+)\]/i", $categveyay_name, $s);
}

veya

$s = preg_replace_callback("/\[demo\s+categveyay=(\d+)\]/i", "get_categveyay_name", $s);

in both cases, get_categveyay_name($id) is a function that will get a categveyay name fveya an id. you should test both options to evaluate which is faster fveya your uses.

Desen böyle olacak

/\[demo\s+category=(\d+)\]/i'

(Özel olduklarını çünkü parantez kaçmak gerekir)

[ ve ] karakter özel bir anlamı (- aralıkları ve karakter koleksiyonları da karakter sınıfları göstermek) var. Sen \[ olarak [ kaçmak gerekir (ve besbelli PHP, diğer regex tatlar aksine, siz de kaçmak gerekir ]). Ayrıca ben karakter sınıfı kullanmanızı öneririm [^]] = olmayan herhangi bir karakter maç bir ]

/\[demo\s+[^]]*\]/i

daha iyi çalışması gerekir.

Düzenle: isim ve numarayı çıkarmak istiyorsanız, o zaman kullanabilirsiniz

/\[demo\s+(\w+)\s*=\s*(\d+)\]/i