PHP düzenli ifade kullanarak ilk P etiketi özniteliği eklemek nasıl?

5 Cevap php

WordPress bu biçimde mesajlarını tükürür:

<h2>Some header</h>
<p>First paragraph of the post</p>
<p>Second paragraph of the post</p>
etc.

Ilk paragrafta benim serin stil almak için (sadece idareli iyi görünüyor şeylerden biri) Ben bir preg_replace ile çıkışını filtre işlevini get_posts içine kanca gerekir.

Hedef gibi bakmak için yukarıdaki kodu almak için:

<h2>Some header</h>
<p class="first">First paragraph of the post</p>
<p>Second paragraph of the post</p>

(Hata: ": Bilinmeyen değiştirici ']' preg_replace () [function.preg-yerine]") Ben şimdiye kadar bu var ama o bile işe yaramıyor

$output=preg_replace('<p[^>]*>', '<p class="first">', $content);

Bunun yerine H2 vurmak çünkü üst kapta ilk basamak meta-seçici (bu IE6 destekleyen biridir): Ben IE6 desteklemek gerekiyor çünkü CSS3 meta-seçicileri kullanamazsınız, ve ben uygulayamazsınız İlk P.

5 Cevap

Cevapları okuyarak orada çalışacak bazı ama tüm harici ayrıştırma kütüphaneyi kullanarak ya da muhtemelen P etiket dışındaki etiketleri eşleşen ya da aynı zamanda onun özelliklerini eşleşen ya dezavantajları var.

Ben gelen str_replace_once fonksiyonu ile bu çözüm kullanarak sona erdi here:

str_replace_once('<p>', '<p class="first">', $content);

Basit yeterli ve istediği gibi çalışır. İşte tam WordPress kod parçacığını her zaman the_content () denir ilk paragrafı filtre bulunuyor:

add_filter('the_content', 'first_p_style');
function first_p_style($content) {
 $output=str_replace_once('<p>', '<p class="first">', $content);
 return ($output);
}

Tüm cevaplar için teşekkürler!

Daha kolay ve daha güvenilir gibi this one gibi bir HTML ayrıştırıcı kullanmak bulabilirsiniz. HTML düzenli ifadelerle (teknik olarak, imkansız) güvenilir ayrıştırmak için çok zordur, ve ayrıştırıcı size ilk sayfasında ilgilendiğiniz düğümleri bulmak için çok basit bir araç verecektir the doc bir sekme var "Nasıl HTML öğeleri değiştirmek için" etiketli.

Two right possibilities :

  1. Javascript bunu. Kullanma jQuery, örneğin, bir satır meselesi: $("h2").next().addClass("first")
  2. Bir HTML parser kullanın. Gerçekten de, regexp are not a good tool to do what you want to do. Sadece bu amaç için bir bütün HTML ayrıştırıcı yüklenirken beri overkill, gerçekten iyi Javascript kullanarak olurdu edilir.

The wrong way

Tabii ki, soruyu anwser için, burada ben regexp ile happends yapmak düşünemiyorum en iyi yoludur. Ama, ben bunu önermiyoruz.

preg_replace('#(</h2>\s*<p[^>]*)>#im', '$1 class="first">', '<h2>Some header</h> <p>First paragraph of the post</p> <p>Second paragraph of the post</p> ');

Yapmamız olduğunu:

  • preg_replace kullanarak bu yüzden kodunu değiştirmek için gelişmiş regexpi kullanabilirsiniz;
  • "m" ve "i" bayrak yüzden sıradanifade satır sonu veya durum hakkında rahatsız etmez kullanarak;
  • </h2>\s* kapanış "h2" etiketleri maç ve tüm alanlarda / satır sonra sonları için kullanıyor;
  • *<p[^>]*, "p" etiketini ve bugünkü attributs maç için kullanıyor;
  • Bu kaydetmek için parantez kullanarak;
  • Biz kısmı biz kaydetmek eşleşen dize yerine yerine "$ 1" kullanarak;
  • sınıf ekleme ve ">" kapanış.

Aklıma geri ilk beraberlik bir sınıfı zaten davayı ele olmamasıdır.

Of, ve arada, <h2>...</h> yerine <h2>...</h2>. Var Bu bir yazım hatası olup olmadığını bilmiyorum ama ben o olduğunu düşünmüştüm. Eğer o değil buna göre düzenli ifade değiştirin.

Sorun bir preg_* fonksiyonu regex ilk karakteri bir değiştirici sınırlayıcı olarak çekilmiş olmasıdır. Ne gerek ediyorum gibi bir şeydir:

$output = preg_replace('~<p\b([^>]*)>~', '<p class="first" \1>', $content, 1);

Bu aynı zamanda <p> olabilecek nitelikleri herhangi bir ekstra geri koyar.

Genel olarak, olsa, CSS seçiciler ve IE için bir JS geri dönüş yapmak temiz.

EDIT: Katma yedek sınırı ve sözcük sonu.

Bu özel durumda sıradanifade çözüm oldukça kolay olurdu

echo preg_replace('~</h2>\s*<p~', "$0 class='first'", $html);