preg_match és utf-8
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ő:(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
■ 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]);
}
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
kimaradt
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. :)
/regex/u
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.működik
a tanácsod kipróbáltam, az is működik, azt is köszönöm. :)
Pozícióra illeszkedik
\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.van különbség
preg_quote
mik vannak
eddig egyébként ezt használtam: