Fonksiyonları ile modifiye geribaşvuru değiştirin Regex

3 Cevap php

I want to replace the class with the div text like this :
This: <div class="grid-flags" >FOO</div>

Oldu: <div class="iconFoo" ></div>

Yani sınıf "icon" olarak değiştirilir. ucfirst (strtolower (FAN)) ve metin kaldırılır

Test HTML

<div class="grid-flags" >FOO</div>

Model

'/class=\"grid-flags\" \>(FOO|BAR|BAZ)/e'

Yedek

'class="icon'.ucfirst(strtolower($1).'"'

Bu benim görünüşte yüzlerce denedim yedek dize bir örnektir. Ben / e değiştirici PHP kodu değerlendirir okudum ama ben bu yüzden bunu yapmak için hangi yolu olarak kayboldum sınıf adı etrafında çift tırnak gerekiyor çünkü benim durumumda nasıl çalıştığını anlamıyorum.

Ben backref örneğin üzerinde varyasyonlar denedi. strtolower ('$ 1'), strtolower ('\ 1'), strtolower ('{$ 1}')

Ben tek ve çift tırnak ve çeşitli öncelemeli vb denedim ve hiçbir şey henüz çalıştı.

Ben bile şans yok) ile (preg_replace_callback çalıştı

function callback($matches){
    return 'class="icon"'.ucfirst(strtolower($matches[0])).'"';
}

3 Cevap

Bana ne demek çalışmak denemek için zor oldu, ama ben böyle bir şey istiyorum düşünüyorum:

preg_replace('/class="grid-flags" \>(FOO|BAR|BAZ)/e',
             '\'class="icon\'.ucfirst(strtolower("$1")).\'">\'',
             $text);

Senin örneğin giriş çıkış:

<div class="iconFoo"></div>

Eğer istediğiniz bu değilse, bize bazı örnek girişler ve çıkışlar verebilir misiniz?

Ve ben bu bir HTML çözümleyici ile daha kolay olacağını kabul etmek gerekir.

Bunun yerine e kullanarak kullanabilirsiniz seçeneği (değerleme) preg_replace_callback().

$text = '<div class="grid-flags" >FOO</div>';
$pattern = '/class="grid-flags" >(FOO|BAR|BAZ)/';
$myCB = function($cap) {
  return 'class="icon'.ucfirst($cap[1]).'" >';
};
echo preg_replace_callback($pattern, $myCB, $text);

Ama bunun yerine düzenli ifadeler kullanarak size simple_html_dom veya php en DOM extension gibi html için daha uygun bir ayrıştırıcı düşünebilirsiniz.

Bu benim için çalışıyor

$html = '<div class="grid-flags" >FOO</div>';

echo preg_replace_callback(
    '/class *= *\"grid-flags\" *\>(FOO|BAR|BAZ)/'
  , create_function( '$matches', 'return \'class="icon\' . ucfirst(strtolower($matches[1])) .\'">\'.$matches[1];' )
  , $html
);

Sadece parsing HTML with regex sorunlarının farkında olmak.