Düzenli ifade nedeniyle PCRE'nin sınırlamalar Apache çöküyor

0 Cevap php

Şu anda bbcode ayrıştırma motoru oluşturma ve ben kendi başıma çözemiyorum ne bir durumla karşılaşmadım.

The thing is, that I popped into a problem exactly like this one: Apache / PHP on Windows crashes with regular expression

Ben Apache Aşağıdaki örnekteki gibi bir şey yaparsanız, çünkü 690 (PCRE'nin için 1MB bellek sınırı) ulaşan yineleme sayısının çöküyor demektir:

$txt = '[b]'.str_repeat('a', 338).'[/b]';  // if I change repeat count to lower value it's ok
$regex = '#\[(?P<attributes>(?P<tag>[a-z0-9_]*?)(?:=.*?|\s.*?|))](?P<content>(?:[^[]|\[(?!/?(?P=tag)])|(?R))+?)\[/(?P=tag)]#mi';

echo preg_replace_callback($regex, function($matches) { return $matches['content']; }, $txt);

Yani nasılsa benim regex * ve + ihtiyacını en aza indirmek gerekiyor, ama belki bir şey önermek olabilir ama ben bu yüzden fikir bitti orası.

Other approaches for parsing bbcode (that could handle nested tags) are welcome. However I would not like to use an already built class or something. I like to do things on my own!

Ben de PECL ve Armut HTML_BBCodeParser içine baktım. Ama benim uygulama uzantıları bağımlı olmak istemiyorum. Ben burada yapmaya çalışıyorum BBCode ayrıştırıcı kullanımını yoksa ben bu uzantı için denetler bazı script olabilir ve daha fazla muhtemeldir.

Benim açıklamaları kasvetli eğer Üzgünüm, ben İngilizce yanlısı değilim ^ ^

EDIT. Yani regex açıkladı:

\[(?P<attributes>(?P<tag>[a-z0-9_]*?)(?:=.*?|\s.*?|))]

Bu benim açılış etikettir. Ben adında grupları kullandık. 'Etiketi' ile ben etiketi tanımlamak ve 'bağlıyor' I etiketleri niteliklerini belirlemek. Ayrıca bir özellik olarak etiketi düşünün. Peki burada ne oluyor? Ben bir etiket, bir etiket eşleştirilir, ben etiket kapatma ulaşıncaya kadar \s (ayırıcı) sonra = işareti falan sonra bir şey maç denemek maç denemek {[(2) }].

(?P<content>(?:[^[]|\[(?!/?(?P=tag)])|(?R))+?)

Şimdi burada ben içerik maç için çalışıyorum. Bu zor bir parçasıdır. Ben herhangi bir bulursam ben olmayan herhangi bir karakter arıyorum [ve sonra benim biten etiket veya özyineleme değil ise kontrol, ve ben kadar bunu regex motoru söylemek ....

\[/(?P=tag)]

... Bitiş etiketi bulunur.

0 Cevap