Regex sorunu (PHP)

2 Cevap php
[quote=Username here]quoted text here[/quote]

Reply text here

Ben "Burada Adı" saklayan bir düzenli ifade gerekiyor, "Burada Alıntılanan metni" ve bir Array "metni buraya Yanıtla".

Bu ifade yuvalama lutfen desteklemesi gerekir. Eks:

[quote=Username2 here][quote=Username here]quoted text here[/quote]

Reply text here[/quote]

Reply text here

2 Cevap

Bu regex (grup 2) ek bir son cevap ile (grup 1) iç içe alıntı bloku ile eşleşir:

(\[quote=[^]]*](?:(?R)|.)*\[/quote])(.*)

Biraz demo:

$text = '[quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]More text';
preg_match('#(\[quote=[^]]*](?:(?R)|.)*\[/quote])(.*)#is', $text, $match);
print_r($match);

üretir:

Array
(
    [0] => [quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]More text
    [1] => [quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]
    [2] => More text
)

Biraz açıklama:

(                  # open group 1
  \[quote=[^]]*]   #   match '[quote= ... ]'
  (?:(?R)|.)*      #   recursively match the entire pattern or any character and repeat it zero or more times
  \[/quote]        #   match '[/quote]'
)                  # open group 1
(                  # open group 2
  .*               #   match zero or more trailing chars after thae last '[/quote]'
)                  # close group 2

Ancak, PHP tarafından desteklenen bu özyinelemeli regex yapıları kullanarak olanları baş dönmesi olabilir ... Ben John Kugelman gibi küçük bir çözümleyici için önerilen tercih ediyorum.

Bir regex imkansızdır - - Eğer bir şekilde ya eşleşen tırnak ile iç içe değerler döndürmek istemiyorum varsayarak sadece ihtiyacınız yok parçaları bölebilirsiniz:

preg_split('/(\[quote=|\[quote]|]|\[/quote])/', $yourstring);