Biztos akadt mindenkinek már olyan problémája hogy volt egy szöveg amiben megszeretett volna keresni egy adott szót, kifejezést. Vagy a honlapodra szerettél volna olyat hogy a júzer rátudjon keresni egy cikkben, valamilyen szóra. Ilyenkor biztos elgondolkodtál rajta, hogy mivel is lenne a legcélszerűbb ezt megvalósítani, milyen lehetőségek is vannak erre a php-ban. Több megoldás közül is válogathatunk, nézük is őket szépen sorjában.
Tartalomjegyzék
Metaphone
Kezdjük a metaphone() függvénnyel.
Ez a függvény egy sztring metaphone-értékét számolja ki, ami egy jelzés arra, hogyan hangzik a szó. Az „úgy hangzik, mint” típusú kereséseknél lehet hasznunkra.
Szintaktikája:
1 | metaphone(sztring); |
Azt hiszem egyértelmű, egy értéket vár, azt a karaktersorozatot melynek a metaphone értékét szeretnénk kiszámolni.
Soundex
Hasonló a metaphone függvényhez. Szintaktikailag is ugyanaz.
Levenshtein
A harmadik a levenshtein() függvény.
Ez már egy kicsit más. Két sztring közötti Levenshtein-távolságot számolja ki, ami az egyezőség mértéke. Azaz hány karaktert kell törölni, hozzáadni, vagy lecserélni egy sztringben ahhoz hogy azonos legyen az adott sztringel.
Minél kisebb a szám annál jobb. Ezt a függvényt jól tudjuk hasznosítani szövegben való keresésekkorm de talán egy kicsit pontatlan.
Nézzünk egy példát. A harapófogó és a maratottfogó(meg ne kérdezzétek mi az) közti Levenshtein távolság 5. Aki nem hiszi, számolja csak ki.
Szintaktikája:
1 | levenshtein(sztring1, sztring2); |
A sztring1 és a sztring2 a két összehasonlítani kívánt karakterlánc.
Similar text
Jöjjön a negyedik, a similar_text() függvény.
Két sztring közötti hasonlóságot számolja ki. Hasonló a levenshtein-hez de pontosabb és több feldolgozási időt igényel.
Szintaktikája:
1 | similar_text(sztring1, sztring2, $p); |
A sztring1 és a sztring2 az összehasonlítani kívánt karakterláncok. A harmadik értéket nem muszály megadni, a hasonlóság százalékos értékét kapjuk meg a megadott változóba.
Mi ezek közül a similar_text() fügvénnyel fogunk részletesebben foglalkozni.
Írtam egy kis függvényt ami megkeres egy adott sztringet egy szövegrészben és kiírja a szöveget kiszínezve benne a keresett sztringhez hasonló részeket.
Lássuk is a kódot, a magyarázat utána kövekezik:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php function searchText($text, $key, $stats = true) { $num = 0; $words = explode(' ', $text); foreach ($words as $out) { $result = similar_text($key, $out, $p); if ($p >= 60 ) { if ($stats == true) { print('' . $p . '% : ' . $out); } else {} $output[$num] = $out; $num = $num + 1;} } foreach ($output as $result) { $text = str_replace($result, '<font color="#EE0000">' . $result . '</font>', $text); } print('' . $text); } ?> |
A függvény három értéket vár, az első, az a szövegrész melyben keresni szeretnénk, a második az a sztring amit keresni szeretnénk, és a harmadik érték egy opcionális érték, nem muszály megadni. Ha true az értéke akkor a függvény kiírja az eredmények keresési értékeit, szóval hogy melyik talált szónak hány százalékos a hasonlósága a keresett szóval, egyébként nem ír ki semmit.
A $num változó egy tömb számozásához kell majd egy ciklusban.
A szöveget melyben keresni fogunk, egy tömbbe tördelem a szóközök mentén. Ez a tömb a $words tömb.
Ezekután végig megyek a $words tömb elemein a foreach() szerkezettel.
Majd egy feltételes szerkezet segítségével, ha a $stats értéke igaz kiiratom a kereséi eredményeket százalékban, majd az eredményeket, melyek megfeleltek annak a feltételnek, hogy 60% vagy nagyobb a hasonlóságuk a keresett szóval, az $output tömbbe pakolom.
Majd a következő foreach() szerkezetben, kicserélem a talált szavakat, a szövegben és „kiszínezem” őket.
Aztán kiíratom a formázott szöveget.
És akkor nézzük hogy is hívjuk meg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php $szoveg = '- illegális (warez) fizetős honlapok és ftp szerverek reklámozása (pl. smsweb), erre vannak más felületek. - Tilos "pénzért írok warez CD-ket", "pénzért másolok" dolgokat hirdetni, olyan formában sem hogy "kipróbáltam ezt és ezt és nagyon jó" úgyis tudjuk miről van szó.. ! - a moderálás lehetőségét fenntartom, egyes esetekben él(het)ek is vele. - a szekciód tartalmáért mind témák, mind pedig hozzászólások tekintetében Te vagy a felelős, a Szabályzatot be kell tartanod, és tartatnod. - Mások szólásszadságának csorbítására alkalmas hozzászólások, fenyegetés, személyeskedés, rágalmazás, emberi méltóság megsértése, a vitapartner lejáratása, szidalmazása, minősíthetetlen hangnem. - sértő, obszcén, vulgáris, rágalmazó, gyűlöletkeltő valamint bármilyen más módon jogsértő hozzászólások - Üres hozzászólások, illetve a véletlenül duplán beírt hozzászólások egyike. - Moderátor által törölt hozzászólások visszamásolása. - A kulturált, folyamatos társalgást feltűnően és szándékosan akadályozó és zavaró, agresszív vagy off-topic hozzászólások. - Céltalanul vitát szító hozzászólások. - A szándékosan nagyméretű képek, szövegfájlok indokolatlan felmásolása ami a rendszer működését lényegesen lassítja. - A moderálással és szerkesztéssel kapcsolatos véleményeket, észrevételeket kifejezetten az erre a célra létrehozott "Ha először vagy itt / moderálás" topicban lehet beírni, ellenkező esetben törlésre kerülnek. - Bárki személyes adatának (pl. név, munkahely, lakhely, beosztás) engedély nélküli közzététele. - Szándékos flood és reklám esetén. Ha kérdésed vagy mondanivalód van, azt 1 témába tedd be, a többit törölni fogom.'; searchText($szoveg, 'warez'); ?> |
Én a tutorial.hu fórum szabályzatának egy részletében kerestem. :) Méghozzá a warez szót. Mivel nem adtam meg a harmadik értéket, és mivel az alapbeállítás true, a függvény kiírja nekem a keresési eredményeket is. Majd utána szépen a szöveget, kiszínezve benne a warez és a hozzá hasonló szavakat. Hogyha véletlenül azt írom be hogy waroz, akkor is vaószínű hogy ezt az eredményt kapom, hiszen a pontosság csak 60%-ra van állítva.
Körülbelül ennyi. Ezt ezer meg ezer féle módon lehet még módosítani, ez tényleg csak az alap. Már akkor tökéletesen használható életszerű helyzetekben ha, csinálsz egy formot és a formból kapott eredmény a keresett karakterlánc.
Szóval tessék próbálgatni, játszani vele és ha bármiféle probléma van vele akkor megtaláltok a fórumon.
Szerző: Rendo
Szia ezt a hiba üzit kapom miért?
És ez van a 23-ik sorba
Na megoldottam már hibátlan. De lenne kérdésem ez most mire is jó vagy hogy is kel ezt igazából használni?