çevrelediği iç içe dizeleri işlemek için özyinelemeli düzenli ifade {ve | |}

4 Cevap php

Bir projede ben böyle desenleri ile bir metin var:

{| text {| text |} text |}
more text

Ben parantez ile ilk bölümünü almak istiyorum. Bunun için ardışık preg_match kullanın. Aşağıdaki kodu zaten çalışıyor:

preg_match('/\{((?>[^\{\}]+)|(?R))*\}/x',$text,$matches);

Ben sembolü eklerseniz ama "|", ben boş bir sonuç var ve ben nedenini bilmiyorum:

preg_match('/\{\|((?>[^\{\}]+)|(?R))*\|\}/x',$text,$matches);

{Metin} gibi bir metin bir şey de var, çünkü ben ilk çözüm kullanamazsınız. Biri burada yanlış ne bana söyleyebilir? Thx

4 Cevap

Bu deneyin:

'/(?s)\{\|(?:(?:(?!\{\||\|\}).)++|(?R))*\|\}/'

Özgün regexdeki Eğer karakter sınıfını kullanın [^{}] sınırlayıcı dışında bir şey eşleşecek. Ayraçlar tek karakter olduğunda Bu iyi, ama seninki iki karakter vardır. : Bu bir şeye ihtiyacım var, bir çok karakter dizisini-maç değil

(?:(?!\{\||\|\}).)++

Nokta herhangi bir (Satırsonu dahil, (?s) teşekkür) karakteri, ancak maçlar ilerleme, bir {| veya |} dizisinin parçası olmadığını tespit etti sonra . Ben de atom grubu ((?>...)) düştü ve (++) yığılmayı azaltmak için bir iyelik nicelik ile değiştirilir. Ama kesinlikle catastrophic backtracking önlemek için regex bu bölümünde bir ya da diğer kullanmalısınız.

Düzenli ifadeler çalışmak için birkaç öneri var, ama orijinal sıradanifade başarısız neden merak ediyorsanız, okumaya devam ettik. Tag | "}" bir kapanış maç için zamanı geldiğinde sorun yatıyor. |} alt ifade başarısız olmasına neden, | "" (?>[^{}]+) (veya [^{}]++) alt ifade maç olacak. Alt ifadesinde hiçbir Backtracking ile, başarısız maçı kurtarmak için hiçbir yolu yoktur.

Bkz http://stackoverflow.com/questions/1896647/php-help-with-my-regex-based-recursive-function

Kullanımınız için uyarlamak için

preg_match_all('/\{\|(?:^(\{\||\|\})|(?R))*\|\}/', $text, $matches);

Lütfen hızlı cevap için teşekkürler. Ben zaten bu sayfada ve diğerleri bir göz vardı.

Ben de yayınlanmıştır ve ben çözüm test gibi bir şey denedim, ama yine de. Ben boş bir sonuç almak. İşte ayıklamak zorunda metnin bir örnektir:

{| border=1 align=right cellpadding=4 cellspacing=0 width=250 style="margin: 0 0 1em 1em; background: #f9f9f9; border: 1px #aaaaaa solid; border-collapse: collapse; font-size: 95%;"
|+<big><big>'''남극'''</big></big>
| align=center colspan=2 style="background:#f9f9f9;" |

[[파일:LocationAntarctica.png|250px|남극의 위치.]]
|-
| '''[[면적]]''' || 14,000,000&nbsp;km²
|-
| '''[[인구]]''' || ~1000 (비상주인구)
|-
| '''[[정부]]''' <br />
|| [[남극 조약]]<br />
- 현재 사무국장 <br />[[요하네스 후버]]
|-
| '''[[남극 조약#영유권 주장 회원국|영토<br />주장국]]''' || {{ARG}} <br /> {{AUS}} <br /> {{CHL}} <br /> {{FRA}} <br /> {{NZL}} <br /> {{NOR}} <br /> {{국기나라|영국}}  
|-
| '''인터넷 도메인''' || [[.aq]]
|-
| '''국제 전화''' || +672
|}

[[파일:Antarctica_6400px_from_Blue_Marble.jpg|thumb|250px|남극의 인공위성 합성사진.]]
[[파일:AntarcticaDomeCSnow.jpg|thumb|200px|남극의 모습]]

'''남극'''(南極)은 [[지구]]의 최남단에 있는 대륙으로, 한가운데 [[남극점]]이 있다. 남극 대륙은 거의 대부분 [[남극권]] 이남에 자리잡고 있으며, 주변에는 [[남극해]]가 있다. 면적은 약 1,440만 km²로서 [[아시아]], [[아프리카]], [[북아메리카]], [[남아메리카]]에 이어 다섯 번째로 큰 대륙이다. 남극의 약 98%가 얼음으로 덮여 있는데, (얼음으로 덮이지 않은 면적은 약 280,000 ㎢에 불과함) 이 얼음은 평균 두께가 1.6km에 이른다. 
...