Question

Je suis enfin en train d'analyser le texte wiki des wikipedias. J'ai le type de texte suivant ici:

{{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]]

J'ai besoin de récupérer toutes les lignes d'un tableau qui commencent par le motif

* '''

Je pense qu'une expression rationnelle serait appelée à l'ordre ici, mais je suis vraiment foiré sur ma partie expressions régulières.

De plus, dans un autre exemple, j'ai le texte suivant:

{{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. 

Je dois extraire la infobox ici. La infobox est et inclut tout le texte entre la première occurrence de

{{Infobox Settlement

et se termine par la première occurrence de

}} <!-- Infobox ends -->

Je suis totalement perdu en ce qui concerne les expressions régulières et je pourrais utiliser l'aide ici. J'utilise php.

EDIT! AIDE!

Je me bats depuis 40 heures et je ne parviens pas à faire comprendre l'expression régulière stupide :( Jusqu'à présent, j'ai juste ceci:

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

Mais cela ne fonctionne pas, je veux qu'il lise toutes les données de chaîne entre {{infobox et se termine par un \ n}} \ n

J'utilise Php et je n'arrive pas à le faire fonctionner :( Il retourne simplement la première occurrence de}} en ignorant le fait que je veux qu'il récupère}} avec le saut de ligne précédent. Aidez-moi avant de perdre plus de temps la santé mentale sur ce: '(

Était-ce utile?

La solution

  

J'ai besoin d'extraire l'infobox ...

Essayez ceci, cette fois en vous assurant que le mode dotall est activé :

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


Et encore une fois, explication à cela:

(?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

Ceci correspondra à l'expression finale (vous pouvez l'exclure - vous pouvez supprimer le lookahead et inclure uniquement le contenu pour que celle-ci inclue la fin, si nécessaire.

Mise à jour, en fonction du commentaire à répondre:

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

Comme ci-dessus, mais Lookahead recherche deux accolades sur leur propre ligne.

Pour autoriser éventuellement le commentaire également, utilisez:

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

Autres conseils

MediaWiki est une source ouverte. Consultez leur code source ...; -)

Je pense que le meilleur moyen est de fusionner toutes les lignes en une seule chaîne, en particulier pour l'infobox.

Ensuite, quelque chose dans le sens de

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

pour la première partie (tout ce qui suit une nouvelle ligne commençant par * '' 'et qui n'est pas une nouvelle ligne).

Et pour la deuxième partie, je ne suis pas sûr que ce soit la bonne, mais c’est un bon endroit pour jouer un peu: http://www.solmetra.com/scripts/regex/index.php

Et voici une brève référence pour la syntaxe des expressions rationnelles: http://www.regular-expressions.info/reference.html

  

Je dois extraire toutes les lignes d'un tableau qui commencent par le modèle * '' '

Activez le mode multiligne et assurez-vous que le mode dotall est désactivé , et utilisez ceci:

^\* '''.*$


Cette expression disséquée est:

(?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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top