Нужны простые регулярные выражения здесь - PullRequest
0 голосов
/ 17 июня 2009

Я наконец разбираю текст википедии. У меня есть следующий тип текста здесь:

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

Мне нужно получить все строки в одном массиве, которые начинаются с шаблона

* '''

Я думаю, здесь будет вызываться регулярное выражение, но я действительно запутался в своей части регулярных выражений.

Плюс в другом примере у меня есть следующий текст:

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

Мне нужно извлечь инфобокс здесь. Информационный блок включает и включает весь текст между первым появлением

{{Infobox Settlement

и заканчивается первым появлением

}} <!-- Infobox ends -->

Я полностью потерян, когда дело доходит до регулярных выражений, и я мог бы использовать помощь здесь. Я использую Php.


EDIT! ПОМОГИТЕ!

Я боролся в течение 40 часов, и я не могу заставить глупое регулярное выражение работать правильно :( до сих пор у меня просто так:

{{Infobox [^ \ Ъ (\ г | \ п)}} (\ г | \ п) \ Ь] * [\ Ъ (\ г | \ п)}} (\ г | \ п) ( \ г | \ п) \ Ь]

Но это не работает. Я хочу, чтобы он прочитал все строковые данные между {{infobox и оканчивается на \ n}} \ n

Я использую Php и не могу заставить это работать :( Он просто возвращает первое вхождение}}, игнорируя тот факт, что я хочу его получить}} с предыдущим переводом строки. Помогите, пожалуйста, прежде чем тратить больше своих здравомыслие на этом: '(

Ответы [ 4 ]

3 голосов
/ 18 июня 2009

Мне нужно извлечь инфобокс ...

Попробуйте, на этот раз убедитесь, что режим точки доступа включен :

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


И снова объяснение этому:

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

Это будет соответствовать (но исключая) конечному выражению - вы можете удалить сам заголовок и включить только содержимое, чтобы оно включало окончание, если необходимо.

Обновление на основе комментария к ответу:

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

То же, что и выше, но смотрящий вперед ищет две скобки на своей собственной линии.

Чтобы дополнительно разрешить комментарий, также используйте:

\{\{Infobox.*?(?=\n\}\}(?: <!-- Infobox ends-->)?\n)
3 голосов
/ 17 июня 2009

MediaWiki с открытым исходным кодом. Взгляните на их исходный код ...; -)

1 голос
/ 18 июня 2009

Мне нужно получить все строки в одном массиве, которые начинаются с шаблона * '''

Включите многострочный режим и убедитесь, что режим точечного вызова отключен , и используйте это:

^\* '''.*$


Это выражение рассекается:

(?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
1 голос
/ 17 июня 2009

Я думаю, что лучший способ - объединить все строки в одну строку, особенно для инфобокса.

Тогда что-то вроде

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

для первой части (все после новой строки, начинающиеся с * '' 'и не являющиеся новой строкой).

И что касается второй части, я не совсем уверен прямо сейчас, но это хорошее место, чтобы немного поиграться: http://www.solmetra.com/scripts/regex/index.php

А вот краткая справка по синтаксису регулярного выражения: http://www.regular -expressions.info / reference.html

...