Regex

Moje znanje regexov je bilo do nedavnega nekako omejeno na osnove (razni a-z 0-9 mogoče še kakšen \w in \s), ampak zaradi potrebe po parsanju ne ravno prijetnih spakedrank je bilo treba rahlo bolj se poglobiti v to.

Šlo je, če odštejemo porodne težave, kar precej gladko, do tegale:

pregmatchall('/<strong>([\w]+:)<\/strong>([A-Ža-ž\s\d.+-\/()_]+)<br>/', ...);

Najde sicer 90% vrstic, ki jih iščem, nekaj pa jih pade ven. Recimo tale:

<strong>VARNOST:</strong>4x Airbag (voznik+sovoznik+bočni blazini)meglenke___3. zavorna luč<br>

Čas za lepotne popravke pride kasneje, ampak tukaj res ne vidim razloga, da stvar ne bi ustrezala.
:(

Edit: gre za PHP

3 odgovori

Ce uporabljas UTF-8, poskusaj vkljuciti modifier u:

u (PCRE_UTF8)
This modifier turns on additional functionality of PCRE that is incompatible with Perl. Pattern strings are treated as UTF-8. This modifier is available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32. UTF-8 validity of the pattern is checked since PHP 4.3.5.

Glede naslednjega sicer nisem povsem preprican, ampak vprasanje je, kateri collation uporablja PHP za te regexp funkcije, verjetno tistega iz sistemskega locale-a dolocenega s setlocale(), ki so pa za slovenscino veckrat povsem neuporabni kot ne... Vem vsaj za freebsd, da za sl_SI.UTF-8 uporablja kar ameriski collation... zalostno... bo treba porihtat enkrat za UTF-8, za Latin2 je, za freebsd, collation prispeval ze moj prijatelj Simon. Zakaj to govorim? Ker nisem povsem preprican, da se tisti [a-ž] obnasa povsem tako, kot bi si ti zelel :) Lahko pa se tudi motim, nisem preverjal...

Kljub temu, da je vračal vse možne šumnike, je po tem, ko sem pred parsanjem z icnovom dal vse v utf-8, vrnil vse kakor je treba. Rahlo čudno, ampak ok :)

spicey, niti ni cudno, ce nisi vklopil tistega utf-8 switcha, se zadeva ni obnasala tako, da bi razumela, da uporabljas multi-byte charset... in je tiste tvoje sumnike interpretirala povsem po svoje :)