PHP preg_replace () yardım

4 Cevap php

Bu dize düşünün

hello awesome <a href="" rel="external" title="so awesome is cool"> stuff stuff

Ben herhangi olayini maç için ne regex kullanabilirsiniz awesome çapa başlık özniteliği içerisinde hangi görünmüyor?

Şimdiye kadar, bu ben ile geldi ne (ne yazık ki çalışmıyor)

/[^."]*(awesome)[^."]*/i

Edit

Ben aldı Alan M's advice ve her kelimeyi yakalamak ve bir geri göndermek için bir regex kullanılır. Teşekkürler tavsiye için Alan M. İşte benim son kodudur.

 $plantDetails = end($this->_model->getPlantById($plantId));

        $botany = new Botany_Model();
        $this->_botanyWords = $botany->getArray();
        foreach($plantDetails as $key=>$detail) {
            $detail = preg_replace_callback('/\b[a-z]+\b/iU', array($this, '_processBotanyWords'), $detail); 
            $plantDetails[$key] = $detail;  
        }

Ve _processBotanyWords (...)

   private function _processBotanyWords($match) {
        $botanyWords = $this->_botanyWords;  
        $word = $match[0];
        if (array_key_exists($word, $botanyWords)) {    
            return '<a href="' . PATH_BASE . 'articles/botany-words/#botany-word-' . str_replace(' ', '-', strtolower($word)) . '" title="' . trim($botanyWords[$word]) . '">' . $word . '</a>';
        } else {
            return $word;
        }
    }

Bu iyi bir gün başkasına yardım umuyoruz! Tekrar teşekkürler tüm cevaplar için.

4 Cevap

Bu sizin (yani, o değil miydi?) Biraz önce yayınlanmıştır ve silinen soruya ilişkilidir Asssuming, bu yanlış sizin temel yaklaşımdır. Eğer bir anahtar kelime listesi kelimeleri değiştirerek bu HTML bağlantılar kendinizi üreten söyledi. Sorun anahtar kelimeler uzak aşağı liste bazen oluşturulan başlık nitelikleri görünür ve yanlışlıkla yerini almak olduğunu - ve şimdi hataları düzeltmek için çalışıyoruz.

Altta yatan sorun etkili tekrar tekrar tüm metin işleme, preg_replace için ayrı bir arama kullanarak her anahtar kelimeyi yerine konum olmasıdır. Yapmanız gereken bir süreçtir metin once, her tek kelime eşleştirme ve anahtar kelime listenizde yukarı bakarak; Bu listede ise, değiştirin. I / test PHP kod yazmak için kurulmuş değilim, ama muhtemelen kullanmak istediğiniz preg_replace_callback:

$text = preg_replace_callback('/\b[A-Za-z]+\b/', "the_callback", $text);

"The_callback" sözcüğü arar ve bu listede ise, uygun bağlantıyı oluşturan bir işlevin adıdır; aksi takdirde, eşleşen kelimeyi verir. Bu gibi her sözcüğü işlenirken, verimsiz gelebilir, ama aslında büyük bir orijinal yaklaşım daha more verimli.

Bu konu burada hemen hemen her gün gelir ve temelde sorun şudur: Eğer HTML (ya da XML) ayrıştırmak ya da değiştirmek için düzenli ifadeler kullanarak olmamalıdır. Bu HTML / XML ayrıştırıcıları için var. Yukarıdaki sorun sadece tek karşısında olacak konulardan biridir. Siz çoğunlukla çalışır bir şey olsun ama yine de öyle değil köşe durumlarda orada olacağım.

Sadece bir HTML çözümleyici kullanabilirsiniz.

Tabii, bir ayrıştırma kütüphaneyi kullanarak endüstriyel güç bir çözümdür, ama biz sadece 10 saniye içinde bir şeyler yazmak ve yapılabilir istiyoruz edildi hepimiz süreleri var. Eğer etiketleri görmezden, bir sayfanın etli metni işlemek istiyorum dahaki sefere, sadece ilk strip_tags aracılığıyla girişinizi çalıştırmak deneyin. Sadece düz, görünür metin ve regex güçlerini alacak bu şekilde tekrar yüce egemenlik sürecek.

Bu onu göndermekten çekinmeyin kadar korkunç olduğunu, ancak hızlı kesmek istiyorsanız, sorunu ters yerine - X değil şeyler bulma, IS, bunu değiştirmek o şeyler bulmak, do şey ve geri değiştirin.

Bu ("harika" için) müthiş değiştirmeye çalışıyoruz üstleniyor. Başka bir şey yapıyorsanız, buna göre ayarlayın.

$string = 'Awesome is the man who <b>awesome</b> does and <a href="awesome.php" title="awesome">awesome</a> is.';

$string = preg_replace('#(title\s*=\s*\"[^"]*?)awesome#is', "$1PIGDOG", $string);

$string = preg_replace('#awesome#is', 'wonderful', $string);

$string = preg_replace('#pigdog#is', 'awesome', $string);

Beni aşağı oy vermeyin. Ben kesmek olduğunu biliyorum.