Regexp açık ve kapanış etiketi bulma

2 Cevap php

Regexp özel etiketler bulmak için bir yolu var yani maç

{a}sometext{/a}  

Yanısıra

{c=#fff}sometext{/c}  

Böylece iç içeriğin tüm blok bulur? Sorun someText gibi başka bir etiketi olabilir olduğunu:

{a=http://www.google.com}{b}Hello, world{/b}{/a}  

Ben kadar gelebilir tek çözüm Ben {a ... ... / a için} tek sıradanifade çözümü var, ya da istediğiniz zaman {a ... ... / b} iyi olurdu itibaren maç olur başlangıç ​​maç, ve sonra arka ucunu yukarı bulmak için başka bir yöntem kullanmak ve bu şekilde dışarı kapmak için? PHP 5.2 kullanıyorum ben gerektirdiği tüm seçenekleri var.

2 Cevap

Eğer MediaWiki zaten wiki biçimlendirme dili ile ne yapmaya çalışıyorsun gibi geliyor. Ben onların çözümleyici ve biçimlendirme kullanarak öneririm veya kendi rulo seçerseniz bunu nasıl görmesini ilham bulabilirsiniz.

Manual for Parser.php

Source for Parser.php

Bu çalışır:

$subject = 'bla bla{a=http://www.google.com}{b}Hello, world{/b}{/a} bla';
$regex = '~\\{a(?:=[^}]+)?\\}(.*?)\\{/a\\}~';
preg_match($regex, $subject, $matches);
var_dump($matches);

verir:

array(2) {
  [0]=>
  string(48) "{a=http://www.google.com}{b}Hello, world{/b}{/a}"
  [1]=>
  string(19) "{b}Hello, world{/b}"
}

BEGIN EDIT You could make the regex more general with backreferences

$regex = '~\\{([a-z]+)(?:=[^}]+)?\\}(.*?)\\{/\\1\\}~';

but in that case, I have no idea how to match inner tags of arbitrary depth. END EDIT

Ancak, şiddetle bu amaç için normal bir ifade kullanarak karşı recommened. Ben bir anda, dize üzerinde bir dizi yineleme ve array_pop, (kullanım array_push bulmak etiketleri takip etmek için yardımcı bir yığın kullanır ve {[(2)] önermek } göz için).