ugrás a tartalomhoz

preg_match és utf-8

gex · 2009. Május. 23. (Szo), 19.32
sziasztok,

adott egy pár html fájlból álló oldal, aminél egy keresést kellett megvalósítanom. a legegyszerűbbnek azt találtam, ha végigmegyek a fájlokon, kiszedem a div#content tartalmát, áttolom a strip_tags függvényen majd preg_match-csel keresek benne. az eredmény a kiemelt keresendő szövegen kívül a keresett szó előtt és után álló legfeljebb 100 karaktert tartalmazza.
az illesztés a következő:

$pattern = '#[^\w](.{0,99}[^\w])(' . escape($term) . ')([^\w].{0,99})[^\w]#i';
//...
if (preg_match_all($pattern, $content, $matches)) {
    $result[] = trim($matches[1][0] . '<strong>' . $matches[2][0] . '</strong>' . $matches[3][0]);
}
(az escape egy saját függvény, ami escape-eli (van erre normális magyar szó?) a reguláris kifejezésben speciális jelentéssel bíró karaktereket)

a probléma az, hogy ha egy több bájtos karakter jut az eredmény valamelyik végére, akkor a $matches tömbbe csak egy része kerül be, ami a kiíráskor egy � jelként jelenik meg.

keresgéltem guglin és weblaboron is, de a legígéretesebb témában is az mb_ereg_match-et ajánlotta toxin. ez nekem nem felel meg, mert nem adja vissza az egyezéseket, mint a preg_match $matches paramétere.

köszi a segítséget:
gex
 
1

kimaradt

gex · 2009. Május. 23. (Szo), 19.40
azért használom a preg_match_all-t, mert relevanciaként visszaadom a count($matches)-t is és akkor a $result tömböt rendezni is tudom.

amire még gondoltam, hogy mb_ereg_replace-szel oldom meg az egészet és akkor nincs szükségem a $matches-re.

viszont akkor is érdekel a megoldás. :)
2

/regex/u

Török Gábor · 2009. Május. 23. (Szo), 19.42
Az u (PCRE8) módosító segíthet a regexnél.

Frissítve: a „nem szó” kifejezés helyett (rövidebben egyébként \W) szerintem érdemesebb a szóhatár \b metakaraktert használni.
3

működik

gex · 2009. Május. 23. (Szo), 19.52
kiválóan működik, köszönöm a segítséget!

a tanácsod kipróbáltam, az is működik, azt is köszönöm. :)
5

Pozícióra illeszkedik

Török Gábor · 2009. Május. 24. (V), 15.15
A \b annyival jobb, hogy nem karakterre, hanem karakterpozícióra illeszkedik, így feleslegesen nem fogyaszt. Emiatt kényelmesen át tudod úgy alakítani a regexedet, hogy ne csak pontos egyezést fogadjon el, hanem például toldalékolt formát is.
6

van különbség

gex · 2009. Május. 24. (V), 15.52
igen a nem fogyasztása elég zavaró néhány esetben. pl az én mintámban ha minden \W-t lecserélek \b-re, akkor a "...blabla blabla (blabla..." szövegből maradhat akár "...blabla blabla (" is, ami nem túl szép. (igen ha a nyitó zárójel és az utolsó blabla között marad egy szóköz akkor is, de úgy ritkábban írjuk.)
4

preg_quote

tgr · 2009. Május. 24. (V), 09.47
Saját escape függvény helyett célszerűbb a preg_quote-ot használni.
7

mik vannak

gex · 2009. Május. 24. (V), 15.53
ezentúl figyelmesebb kell olvasnom a doksit. az u módosító felett is simán átfutottam. :)

eddig egyébként ezt használtam:

$term = preg_replace('/([\\\\^$.\[\]|()?*+{}])/', '\\\\$1', $term);
plusz ha nem / volt a határolójel akkor azt is beleraktam (pl témaindítóban a #).