From c8006382739518fda279344638b8e263d84d72dc Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Tue, 27 Aug 2013 15:28:52 -0400 Subject: [PATCH] Improve linkprefix regular expressions The regular expression in the linkprefix message is run against the entire page up to each wikilink, and is expected to capture one group having everything except the prefix and another having only the prefix. For long pages this winds up being a lot of text, so inefficient regular expressions are going to cause problems. The current regex is this: /^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD This is not efficient: it will scan through the string trying to match against every run of one or more letters/non-ASCII characters, backtracking at every one except possibly the last. The only reason this hasn't been a huge problem everywhere is because only a few languages have this feature enabled. This change replaces this with this regex: /^((?>.*(?.*[^a-zA-Z\\x80-\\xff]|))(.+)$/sD The performance improvement here is minor, and Gujarati, Church Slavic, Udmurt, and Ukrainian would still need the other style for their current implementations. For Gujarati, we also use another regex trick: a look-behind assertion in PCRE must be fixed length, so something like (? 'shat mamfhtsach', 'broken-file-category' => 'ṣfaḫi fiha wṣlat milffaṫ mhrrsa', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'ala', 'article' => 'sfht mohtawa', diff --git a/languages/messages/MessagesAz.php b/languages/messages/MessagesAz.php index 7b345b3496..33ef132b12 100644 --- a/languages/messages/MessagesAz.php +++ b/languages/messages/MessagesAz.php @@ -206,7 +206,7 @@ $messages = array( 'noindex-category' => 'İndeksləşdirilməyən səhifələr', 'broken-file-category' => 'İşləməyən fayl keçidləri olan səhifələr', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Haqqında', 'article' => 'Mündəricat', diff --git a/languages/messages/MessagesCe.php b/languages/messages/MessagesCe.php index 4e02782747..0533b95120 100644 --- a/languages/messages/MessagesCe.php +++ b/languages/messages/MessagesCe.php @@ -458,7 +458,7 @@ $messages = array( 'broken-file-category' => '{{#switch:{{NAMESPACE}} |{{ns:0}}=Болх цабеш файлийн хьажорагаш йолу агӀонаш}}', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Цуьнах лаьцна', 'article' => 'Яззам', diff --git a/languages/messages/MessagesCrh_cyrl.php b/languages/messages/MessagesCrh_cyrl.php index a582b187da..1d8cf70ab3 100644 --- a/languages/messages/MessagesCrh_cyrl.php +++ b/languages/messages/MessagesCrh_cyrl.php @@ -230,7 +230,7 @@ $messages = array( 'noindex-category' => 'Индекссиз саифелер', 'broken-file-category' => 'Ичинде бозукъ файл багълантылары олгъан саифелер', -'linkprefix' => '/^(.*?)([a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„]+)$/sDu', +'linkprefix' => '/^((?>.*(? 'Акъкъында', 'article' => 'Саифе', diff --git a/languages/messages/MessagesCrh_latn.php b/languages/messages/MessagesCrh_latn.php index bd6306f978..9b51638099 100644 --- a/languages/messages/MessagesCrh_latn.php +++ b/languages/messages/MessagesCrh_latn.php @@ -224,7 +224,7 @@ $messages = array( 'noindex-category' => 'İndekssiz saifeler', 'broken-file-category' => 'İçinde bozuq fayl bağlantıları olğan saifeler', -'linkprefix' => '/^(.*?)([a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„]+)$/sDu', +'linkprefix' => '/^((?>.*(? 'Aqqında', 'article' => 'Saife', diff --git a/languages/messages/MessagesCu.php b/languages/messages/MessagesCu.php index e9c7e059ed..8a6738d0cb 100644 --- a/languages/messages/MessagesCu.php +++ b/languages/messages/MessagesCu.php @@ -180,7 +180,7 @@ $messages = array( 'category-subcat-count' => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}', 'listingcontinuesabbrev' => '· вѧщє', -'linkprefix' => '/^(.*?)(„|«)$/sD', +'linkprefix' => '/^((?>.*(? 'опьсаниѥ', 'article' => 'члѣнъ', diff --git a/languages/messages/MessagesCv.php b/languages/messages/MessagesCv.php index ef5f4f1ca4..0bbb896fc6 100644 --- a/languages/messages/MessagesCv.php +++ b/languages/messages/MessagesCv.php @@ -153,7 +153,7 @@ $messages = array( 'category-file-count-limited' => 'Ку категоринче $1 файл.', 'listingcontinuesabbrev' => '(малалли)', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff«"]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Ăнлантаркăч', 'article' => 'Статья', diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index ec8f0f2634..2cefeb8a05 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -790,7 +790,7 @@ future releases. Also note that since each list value is wrapped in a unique 'broken-file-category' => 'Pages with broken file links', 'categoryviewer-pagedlinks' => '($1) ($2)', # only translate this message to other languages if you have to change it -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', # only translate this message to other languages if you have to change it +'linkprefix' => '/^((?>.*(? 'About', 'article' => 'Content page', diff --git a/languages/messages/MessagesGa.php b/languages/messages/MessagesGa.php index d7b37f5564..782df4910f 100644 --- a/languages/messages/MessagesGa.php +++ b/languages/messages/MessagesGa.php @@ -218,7 +218,7 @@ $messages = array( 'listingcontinuesabbrev' => 'ar lean.', 'index-category' => 'Leathanaigh innéacsaithe', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Maidir leis', 'article' => 'Leathanach ábhair', diff --git a/languages/messages/MessagesGu.php b/languages/messages/MessagesGu.php index b29ebcdcc2..35edb97420 100644 --- a/languages/messages/MessagesGu.php +++ b/languages/messages/MessagesGu.php @@ -291,7 +291,7 @@ $messages = array( 'noindex-category' => 'અનુક્રમણિકા નહી બનાવેલા પાનાં', 'broken-file-category' => 'ફાઇલોની ત્રૂટક કડીઓવાળાં પાનાં', -'linkprefix' => '/^(.*?)((?:[a-zA-Z\\x80-\\xff]|ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|ક્ષ્|જ્ઞ્|અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|અં|અઃ|અઁ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ૅ|ૉ|ૃ)+)$/sD', +'linkprefix' => '/^((?>.*(? 'વિષે', 'article' => 'લેખનું પાનું', diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php index e4442bf020..2c3b33d42e 100644 --- a/languages/messages/MessagesId.php +++ b/languages/messages/MessagesId.php @@ -481,7 +481,7 @@ $messages = array( 'broken-file-category' => 'Halaman dengan gambar rusak', 'categoryviewer-pagedlinks' => '($1) ($2)', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Tentang', 'article' => 'Halaman isi', diff --git a/languages/messages/MessagesIs.php b/languages/messages/MessagesIs.php index 1350fd563f..86b828177d 100644 --- a/languages/messages/MessagesIs.php +++ b/languages/messages/MessagesIs.php @@ -371,7 +371,7 @@ $messages = array( 'noindex-category' => 'Óraðaðar skrár', 'broken-file-category' => 'Síður með brotna myndatengla', -'linkprefix' => '/^(.*?)([áÁðÐéÉíÍóÓúÚýÝþÞæÆöÖA-Za-z-–]+)$/sDu', +'linkprefix' => '/^((?>.*(? 'Um', 'article' => 'Efnissíða', diff --git a/languages/messages/MessagesKa.php b/languages/messages/MessagesKa.php index ff4feb737b..18dd6be8e0 100644 --- a/languages/messages/MessagesKa.php +++ b/languages/messages/MessagesKa.php @@ -310,7 +310,7 @@ $messages = array( 'broken-file-category' => 'გვერდები ფაილების არასწორი ბმულებით', 'categoryviewer-pagedlinks' => '($1) ($2)', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'შესახებ', 'article' => 'სტატია', diff --git a/languages/messages/MessagesKaa.php b/languages/messages/MessagesKaa.php index 147e19af70..3bac5f9b07 100644 --- a/languages/messages/MessagesKaa.php +++ b/languages/messages/MessagesKaa.php @@ -264,7 +264,7 @@ $messages = array( 'category-file-count-limited' => "Usı kategoriyada to'mendegi {{PLURAL:$1|fayl|$1 fayl}} bar.", 'listingcontinuesabbrev' => 'dawamı', -'linkprefix' => '/^(.*?)([a-zıA-Zİ\\x80-\\xff]+)$/sDu', +'linkprefix' => '/^((?>.*(? 'Haqqında', 'article' => "Mag'lıwmat beti", diff --git a/languages/messages/MessagesKiu.php b/languages/messages/MessagesKiu.php index 8f18ce2eec..8ae5a1043d 100644 --- a/languages/messages/MessagesKiu.php +++ b/languages/messages/MessagesKiu.php @@ -177,7 +177,7 @@ $messages = array( 'noindex-category' => 'Pelê bêendeksıni', 'broken-file-category' => 'Peli be gıreunê dosyeunê sıkıtau', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Heqa', 'article' => 'Pela tedeesteyu', diff --git a/languages/messages/MessagesKm.php b/languages/messages/MessagesKm.php index c4e951be3c..912e930787 100644 --- a/languages/messages/MessagesKm.php +++ b/languages/messages/MessagesKm.php @@ -402,7 +402,7 @@ $messages = array( 'broken-file-category' => 'ទំព័រទាំងឡាយដែលដាច់តំណភ្ជាប់', 'categoryviewer-pagedlinks' => '($1) ($2)', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'អំពី', 'article' => 'មាតិកាអត្ថបទ', diff --git a/languages/messages/MessagesLtg.php b/languages/messages/MessagesLtg.php index 1b4b7f5c45..49460daa15 100644 --- a/languages/messages/MessagesLtg.php +++ b/languages/messages/MessagesLtg.php @@ -105,7 +105,7 @@ $messages = array( 'category-article-count' => '{{PLURAL:$2|Itymā kategorejā ir vīn dūtuo puslopa.|{{PLURAL:$1|Paruodeita $1 puslopa|Paruodeitys $1 puslopys}} nu $2.}}', 'listingcontinuesabbrev' => '(tuoļuojums)', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Aproksts', 'article' => 'Rakstīņs', diff --git a/languages/messages/MessagesMk.php b/languages/messages/MessagesMk.php index fabf59758c..754fcf88c6 100644 --- a/languages/messages/MessagesMk.php +++ b/languages/messages/MessagesMk.php @@ -489,7 +489,7 @@ $messages = array( 'noindex-category' => 'Неиндексирани страници', 'broken-file-category' => 'Страници со прекинати врски до податотеки', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'За {{SITENAME}}', 'article' => 'Статија', diff --git a/languages/messages/MessagesMs.php b/languages/messages/MessagesMs.php index b1aa1254b1..3774bd6f7e 100644 --- a/languages/messages/MessagesMs.php +++ b/languages/messages/MessagesMs.php @@ -338,7 +338,7 @@ $messages = array( 'noindex-category' => 'Laman tak diindeks', 'broken-file-category' => 'Laman yang ada pautan fail yang terputus', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Perihal', 'article' => 'Laman kandungan', diff --git a/languages/messages/MessagesMt.php b/languages/messages/MessagesMt.php index 6bec1c6da2..f1d67a7861 100644 --- a/languages/messages/MessagesMt.php +++ b/languages/messages/MessagesMt.php @@ -411,7 +411,7 @@ $messages = array( 'noindex-category' => 'Paġni mhux indiċizzati', 'broken-file-category' => "Paġni b'ħoloq lejn fajls miksura", -'linkprefix' => '/^(.*?)([a-żA-Ż\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Dwar', 'article' => 'artiklu', diff --git a/languages/messages/MessagesNe.php b/languages/messages/MessagesNe.php index 6abbfdace5..b96da5ac7a 100644 --- a/languages/messages/MessagesNe.php +++ b/languages/messages/MessagesNe.php @@ -193,7 +193,7 @@ $messages = array( 'noindex-category' => 'क्रमांकन नगरिएका पृष्ठहरु', 'broken-file-category' => 'टुटेको फाइल लिंकसितको पृष्ठ', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'बारेमा', 'article' => 'सामाग्री पृष्ठ', diff --git a/languages/messages/MessagesNn.php b/languages/messages/MessagesNn.php index 38d0da7e7f..f9ffcdac44 100644 --- a/languages/messages/MessagesNn.php +++ b/languages/messages/MessagesNn.php @@ -457,7 +457,7 @@ $messages = array( 'noindex-category' => 'Ikkje-indekserte sider', 'broken-file-category' => 'Sider med brotne fillenkjer', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Om', 'article' => 'Innhaldsside', diff --git a/languages/messages/MessagesRo.php b/languages/messages/MessagesRo.php index 269298fb72..2304fb67bf 100644 --- a/languages/messages/MessagesRo.php +++ b/languages/messages/MessagesRo.php @@ -438,7 +438,7 @@ $messages = array( 'noindex-category' => 'Pagini neindexate', 'broken-file-category' => 'Pagini cu legături invalide către fișiere', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Despre', 'article' => 'Articol', diff --git a/languages/messages/MessagesRoa_tara.php b/languages/messages/MessagesRoa_tara.php index 0eab3d6501..425d0e1f9f 100644 --- a/languages/messages/MessagesRoa_tara.php +++ b/languages/messages/MessagesRoa_tara.php @@ -165,7 +165,7 @@ $messages = array( 'broken-file-category' => 'Pàggene cu collegaminde a le file scuasciate', 'categoryviewer-pagedlinks' => '($1) ($2)', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Sus a', 'article' => 'Pàgene de le condenute', diff --git a/languages/messages/MessagesSc.php b/languages/messages/MessagesSc.php index bfc2b2be00..705e4170b6 100644 --- a/languages/messages/MessagesSc.php +++ b/languages/messages/MessagesSc.php @@ -177,7 +177,7 @@ $messages = array( 'index-category' => 'Pàginas indicizadas', 'noindex-category' => 'Pàginas no indicitzadas', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'A propòsitu de', 'article' => 'Artìculu', diff --git a/languages/messages/MessagesSi.php b/languages/messages/MessagesSi.php index 704055d51d..4f40b1fd5c 100644 --- a/languages/messages/MessagesSi.php +++ b/languages/messages/MessagesSi.php @@ -331,7 +331,7 @@ $messages = array( 'noindex-category' => 'සූචිගත නොකළ පිටු', 'broken-file-category' => 'භින්න වූ ගොනු සබැඳි සහිත පිටු', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'පිළිබඳ', 'article' => 'පටුන', diff --git a/languages/messages/MessagesSr_ec.php b/languages/messages/MessagesSr_ec.php index 6b190a5223..88c90c4ade 100644 --- a/languages/messages/MessagesSr_ec.php +++ b/languages/messages/MessagesSr_ec.php @@ -536,7 +536,7 @@ $messages = array( 'noindex-category' => 'Непописане странице', 'broken-file-category' => 'Странице с неисправним везама до датотека', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'О нама', 'article' => 'Страница са садржајем', diff --git a/languages/messages/MessagesSr_el.php b/languages/messages/MessagesSr_el.php index ddb5668886..55ce97bdea 100644 --- a/languages/messages/MessagesSr_el.php +++ b/languages/messages/MessagesSr_el.php @@ -444,7 +444,7 @@ $messages = array( 'noindex-category' => 'Nepopisane stranice', 'broken-file-category' => 'Stranice s neispravnim vezama do datoteka', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'O nama', 'article' => 'Stranica sa sadržajem', diff --git a/languages/messages/MessagesTl.php b/languages/messages/MessagesTl.php index 4142d51f36..1d3335518d 100644 --- a/languages/messages/MessagesTl.php +++ b/languages/messages/MessagesTl.php @@ -285,7 +285,7 @@ $messages = array( 'broken-file-category' => 'Mga pahina na may sirang mga kawing ng talaksan', 'categoryviewer-pagedlinks' => '($1) ($2)', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Patungkol', 'article' => 'Pahina ng nilalaman', diff --git a/languages/messages/MessagesTt_cyrl.php b/languages/messages/MessagesTt_cyrl.php index f25aebf6e5..479dea8310 100644 --- a/languages/messages/MessagesTt_cyrl.php +++ b/languages/messages/MessagesTt_cyrl.php @@ -348,7 +348,7 @@ $messages = array( 'noindex-category' => 'Индексланмаган битләр', 'broken-file-category' => 'Файлларга эшләми торган сылтамалар булган битләр', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Тасвирлама', 'article' => 'Мәкалә', diff --git a/languages/messages/MessagesTt_latn.php b/languages/messages/MessagesTt_latn.php index 6d17c364f3..36d119732a 100644 --- a/languages/messages/MessagesTt_latn.php +++ b/languages/messages/MessagesTt_latn.php @@ -216,7 +216,7 @@ $messages = array( 'index-category' => 'İndekslanğan bitlär', 'noindex-category' => 'İndekslanmağan bitlär', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Taswirlama', 'article' => 'Mäqälä', diff --git a/languages/messages/MessagesUdm.php b/languages/messages/MessagesUdm.php index 7c16f4ac2b..ac03870dce 100644 --- a/languages/messages/MessagesUdm.php +++ b/languages/messages/MessagesUdm.php @@ -151,7 +151,7 @@ $messages = array( 'index-category' => 'Индексировать кароно бамъёс', 'noindex-category' => 'Индексировать каронтэм бамъёс', -'linkprefix' => '/^(.*?)(„|«)$/sDu', +'linkprefix' => '/^((?>.*(? 'Та сярысь', 'article' => 'Статья', diff --git a/languages/messages/MessagesUg_arab.php b/languages/messages/MessagesUg_arab.php index ab5ee42361..16c052b380 100644 --- a/languages/messages/MessagesUg_arab.php +++ b/languages/messages/MessagesUg_arab.php @@ -173,7 +173,7 @@ $messages = array( 'broken-file-category' => 'ھۆججەت ئۇلىنىشى بۇزۇلغان بەتلەر', 'categoryviewer-pagedlinks' => '($1) ($2)', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'ھەققىدە', 'article' => 'مۇندەرىجە', diff --git a/languages/messages/MessagesUk.php b/languages/messages/MessagesUk.php index d75a5706d7..da3ebcd56c 100644 --- a/languages/messages/MessagesUk.php +++ b/languages/messages/MessagesUk.php @@ -504,7 +504,7 @@ $messages = array( 'broken-file-category' => 'Сторінки, що посилаються на неіснуючі файли', 'categoryviewer-pagedlinks' => '($1) ($2)', -'linkprefix' => '/^(.*?)(„|«)$/sD', +'linkprefix' => '/^((?>.*(? 'Про', 'article' => 'Стаття', diff --git a/languages/messages/MessagesUz.php b/languages/messages/MessagesUz.php index e8746b379a..41ba94b888 100644 --- a/languages/messages/MessagesUz.php +++ b/languages/messages/MessagesUz.php @@ -236,7 +236,7 @@ $messages = array( 'noindex-category' => 'Indekslanmaydigan sahifalar', 'broken-file-category' => 'Ishlamaydigan fayl havolalari bor sahifalar', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu', +'linkprefix' => '/^((?>.*(? 'Haqida', 'article' => 'Sahifa', diff --git a/languages/messages/MessagesWar.php b/languages/messages/MessagesWar.php index bd99d85963..62e75c91fc 100644 --- a/languages/messages/MessagesWar.php +++ b/languages/messages/MessagesWar.php @@ -203,7 +203,7 @@ $messages = array( 'noindex-category' => 'Mga diri nakatudlokan nga pagkli', 'broken-file-category' => 'Mga pakli nga mayda utod nga mga sumpay hin paypay', -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', +'linkprefix' => '/^((?>.*(? 'Mahitungod han', 'article' => 'Pakli hin sulod', -- 2.20.1