Frage

Ich bin Parsen schließlich durch Wikipedias Wiki-Text. Ich habe die folgende Art von Text hier:

{{Airport-list|the Solomon Islands}}

* '''AGAF''' (AFT) – [[Afutara Airport]] – [[Afutara]]
* '''AGAR''' (RNA) – [[Ulawa Airport]] – [[Arona]], [[Ulawa Island]]
* '''AGAT''' (ATD) – [[Uru Harbour]] – [[Atoifi]], [[Malaita]]
* '''AGBA''' – [[Barakoma Airport]] – [[Barakoma]]

Ich brauche alle Zeilen in einem einzigen Array abzurufen, die mit dem Muster beginnen

* '''

Ich denke, ein regulärer Ausdruck hier genannt werden würde, um zu bestellen, aber ich bin wirklich obwohl auf meinem regulären Ausdrücken Teil vermassele.

Plus in einem anderen Beispiel habe ich den folgenden Text:

{{otheruses}}
{{Infobox Settlement
|official_name          = Doha
|native_name        = {{rtl-lang|ar|الدوحة}} ''ad-Dawḥa''
|image_skyline          = Doha Sheraton.jpg
|imagesize              = 
|image_caption          = West Bay at night
|image_map              = QA-01.svg
|mapsize                = 100px
|map_caption            = Location of the municipality of Doha within [[Qatar]].
|pushpin_map            =
|pushpin_label_position = 
|pushpin_mapsize        = 
|subdivision_type       = [[Countries of the world|Country]]
|subdivision_name       = [[Qatar]]
|subdivision_type1      = [[Municipalities of Qatar|Municipality]]
|subdivision_name1      = [[Ad Dawhah]]
|established_title      = Established
|established_date       = 1850
|area_total_km2         = 132
|area_total_sq_mi       = 51
|area_land_km2          = 
|area_land_sq_mi        = 
|area_water_km2         = 
|area_water_sq_mi       = 
|area_water_percent     = 
|area_urban_km2         = 
|area_urban_sq_mi       =
|area_metro_km2         = 
|area_metro_sq_mi       = 
|population_as_of       = 2004
|population_note        = 
|population_footnotes = <ref name=poptotal>[http://www.planning.gov.qa/Qatar-Census-2004/Flash/introduction.html Qatar 2004 Census]</ref>
|population_total       = 339847
|population_metro       = 998651
|population_density_km2 = 2574
|population_density_sq_mi = 6690
|latd=25 |latm=17 | lats=12 |latNS=N 
|longd=51|longm=32 | longs=0| longEW=E 
|coordinates_display    = inline,title
|coordinates_type       = type:city_region:QA
|timezone               = [[Arab Standard Time|AST]]
|utc_offset             = +3
|website                = 
|footnotes              = 
}} <!-- Infobox ends -->
'''Doha''' ({{lang-ar|الدوحة}}, ''{{transl|ar|ad-Dawḥa}}'' or ''{{unicode|ad-Dōḥa}}'') is the [[capital city]] of [[Qatar]].  It has a population of 400,051 according to the 2005 census,<ref name="autogenerated1">[http://www.hotelrentalgroup.com/Qatar/Sheraton%20Doha%20Hotel%20&%20Resort.htm Sheraton Doha Hotel & Resort | Hotel discount bookings in Qatar<!-- Bot generated title -->]</ref> and is located in the [[Ad Dawhah]] municipality on the [[Persian Gulf]].  Doha is Qatar's largest city, with over 80% of the nation's population residing in Doha or its surrounding [[suburbs]], and is also the economic center of the country. 
It is also the seat of government of Qatar, which is ruled by [[Sheikh Hamad bin Khalifa Al Thani]]–the current ruling Emir of Qatar. 

Ich brauche die infobox hier zu extrahieren. Die Infobox ist und umfasst den gesamten Text zwischen dem ersten Auftreten von

{{Infobox Settlement

und endet mit dem ersten Auftreten von

}} <!-- Infobox ends -->

Ich bin total verloren, wenn es um reguläre Ausdrücke kommt und ich konnte Hilfe hier verwenden. Ich bin mit Php.


EDIT! HILFE!

Ich habe 40 Stunden kämpfen, und ich kann nicht den dumme reguläre Ausdruck richtig zu arbeiten :( so weit ich das nur haben:

{{Infobox [^ \ b (\ r | \ n)}} (\ r | \ n) \ b] * [\ b (\ r | \ n)}} (\ r | \ n) ( \ r | \ n) \ b]

Aber es funktioniert nicht ich es mit allen String-Daten zwischen lesen möchten {{infobox und endet mit einem \ n}} \ n

Ich bin mit PHP und kann nicht diese :( Es ist einfach gibt das erste Vorkommen}} ignorieren die Tatsache zu arbeiten, dass ich es}} mit vorhergehenden Linefeed abrufen möchten. Hilfe bitte, bevor ich mehr Verschwendung meiner Verstand dazu: '(

War es hilfreich?

Lösung

  

Ich brauche die infobox zu extrahieren ...

Versuchen Sie diese, dieses Mal sicherstellen, dass dotall Modus ist aktiviert :

\{\{Infobox.*?(?=\}\} <!-- Infobox ends -->)


Und wieder Erklärung dafür:

(?xs)    # x=comment mode, s=dotall mode
\{\{     # two opening braces (special char, so needs escaping here.)
Infobox  # literal text
.*?      # any char (including newlines), non-greedily match zero or more times.
(?=      # begin positive lookahead
\}\}     # two closing braces
<!-- Infobox ends --> # literal text
)        # end positive lookahead

Dies wird passen bis (ausschließlich) mit der Endung Ausdruck - Sie können den Look-Ahead entfernen können selbst und umfassen nur den Inhalt, um es das Ende umfassen, falls erforderlich

.

Update, basierend auf Kommentar zu beantworten:

\{\{Infobox.*?(?=\n\}\}\n)

Wie oben, aber Look-Ahead sucht nach zwei Klammern auf ihrer eigenen Linie.

optional auch den Kommentar ermöglichen, verwenden:

\{\{Infobox.*?(?=\n\}\}(?: <!-- Infobox ends-->)?\n)

Andere Tipps

MediaWiki ist Open-Source. Werfen Sie einen Blick auf ihre Quellcode rel="nofollow ...; -)

Ich denke, der beste Weg, um alle Zeilen in eine Zeichenfolge zu verschmelzen, vor allem für die infobox.

Dann etwas entlang der Linien von

$ reg = "\ n (\ * '' '[^ \ n] *)";

für den ersten Teil (alles nach einer neuen Zeile, die mit * beginnen ‚‘‘und ist keine neue Linie).

Und für den zweiten Teil Quire Ich bin jetzt nicht sicher, aber es ist ein schöner Ort, um ein bisschen zu spielen: http://www.solmetra.com/scripts/regex/index.php

Und hier ist eine kurze Referenz für reguläre Ausdrücke Syntax: http://www.regular-expressions.info/reference.html

  

Ich brauche alle Zeilen in einem einzigen Array abzurufen, die mit dem Muster * ''' starten

Aktivieren mehrzeiligen Modus und gewährleisten dotall Modus ist deaktiviert , und verwenden Sie diese:

^\* '''.*$


Dieser Ausdruck seziert ist:

(?xm-s) # Flags:
        # x enables comment mode (spaces ignore, hashes start comments)
        # m enables multiline mode (^$ match lines)
        # -s disables dotall (. matches newline)
^       # start of line
\*      # literal asterisk
[ ]     # literal space (needs braces in comment mode, but not otherwise)
'''     # three literal apostrophes
.*      # any character (excluding newline), greedily matched zero or many times.
$       # end of line
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top