BBCode'u ayrıştırmak için en iyi yolu

5 Cevap php

I'd like to work on a bbcode filter for a php website. (I'm using cakephp, it would be a bbcode helper) I have some requirement.

Bbcodes can be nested. So something like that is valid.

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

Bbcodes can have 0 or more parameters.

Exemple:

[video: url="url", width="500", height="500"]Title[/video]

Bbcodes might have mutliple behaviours.

Let say, [url]text[/url] would be transformed to [url:url="text"]text[/url] or the video bbcode would be able to choose between youtube, dailymotion....

Ben benim ihtiyaçlarını en kapsar düşünüyorum. Ben Şimdiden regex ile bir şey yaptım. Ama benim en büyük problem parametrelerini maç oldu. Aslında, 0 parametreleri ile çalışmak ve bbcode için BBCode iç içe var. Ama parametreler için bir regex maç sırasında eklendiğinde iç içe BBCode'u doğru uyuşmuyor.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" / / Bu *. Değildi ama non-gready matcher

Şu anda benimle tam regex yok, Ama (yukarıda) gibi baktı bir şey vardı.

So is there a way to match bbcode efficiently with regex or something else. The only thing I can think of is to use the visitor pattern and to split my text with each possible tags this way, I can have a bit more of control over my text parsing and I could probably validate my document so if the input text doesn't have valid bbcode. I could Notify the user with a error before saving anything.

I would use sablecc to create my text parser. http://sablecc.org/

Herhangi iyi bir fikir? veya verimli, esnek bbcode çözümleyici yol açabilecek bir şey?

Seni ve benim kötü İngilizce için üzgünüm teşekkürler ...

5 Cevap

Hem pecl ve PEAR BBCode ayrıştırma kütüphanesi var. Yazılım kendi çalışmalarının yıl yeniden olmadan yeterince zor.

Bunların hiçbiri bir seçenek ise, ben geçerli bir XML dizeye BBCode dönüm, ve o en sevdiğiniz XML ayrıştırma rutin kullanılarak konsantre olur. Çok çok kaba burada fikir, ama

  1. Kaçan gereken herhangi varlıkları kaçmak için htmlspecialchars'dan kodu çalıştırın

  2. sırasıyla

  3. [İsmi belirtilen gibi durumlarda kolon için hesap unutmayın:

BBCode düzgün şekilde iç içe ise, tüm (SimpleXML DOMDocument, vb) bir XML ayrıştırma nesnesine bu dize geçmek için ayarlanmış olmalıdır

BBCode ayrıştırma için birkaç mevcut kütüphaneler vardır, kendi yaygınlaştırmaya çalışıyor daha bu içine bakmak daha kolay olabilir:

Here's a couple, I'm sure there are more if you look around:
PECL bbcode
PEAR HTML_BBCodeParser

Yanıt: "Herhangi bir iyi fikir" (Ve ben bu bir bbcode özgü önerileri üzerinde sadece iyileştirilmesi için değil, davet olduğunu varsayarak)

Biz son zamanlarda bbcode yol gidiyor baktı ve yerine htmlpurifier kullanarak verdi. Bu karar htmlpurifier grubunda here ve bbcode tartışmada tarafından listelenen çeşitli yöntemler arasında (kuşkusuz önyargılı muhtemelen) karşılaştırmalar parçası dayanıyordu (yine, htmlpurifer grup tarafından) here

Ve kayıt için ben İngilizce çok iyi olduğunu düşünüyorum. Ben anadil yapabileceği daha çok daha iyi olduğuna eminim.

Kendimi bbcode ayrıştırıcıların içine bakarak edilmiştir. Çoğu regex ve PHP4 kullanımı ve PHP 5.2 + veya hiç çalışmıyor hataları üretmek. PECL bbcode ve ARMUT HTML_BBCodeParser (2012 sonlarında) daha fazla muhafaza edilecek ve kolayca ben çalışmak zorunda hosting kurulumu yüklü değil görünmüyor. StringParser_BBCode 5.2 + için bazı küçük tweaks ile çalışır ancak yeni etiketler eklemek için yöntem beceriksiz olduğunu ve en son 2008'de güncellenen oldu.

Bing arama 4. sayfasında gömülü (ben umutsuz başlamıştı) Ben yeni görünür ve PHP 5.3 gerektirir, jBBCode bulundu. MIT Lisence. Ben özel etiketleri bina denemek için henüz, ama şimdiye kadar ben o PHP 5.3 ile bir hosting hesabına kutunun çalışır denedim sadece bir tanesidir.

Etiketleri ve olmayan etiketleri içine kaynak kod bölmek PREG_DELIM_CAPTURE bayrağı ile preg_split() kullanın. Daha sonra açık bloklar yığını tutarak etiketleri üzerinde yineleme (sen etiketi açılış gördüğünüzde, kapanış etiketi gördüğümüzde, etiket etiketi açılış maçları kapanış kadar dizinin sonundan öğeleri kaldırın. Bir dizi eklemek yani.)