Keresés szövegben


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.

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

Kapcsolódó bejegyzések:
  • Bizonyára sokszor megesett már veletek is, hogy egy végtelen nagyságú tömböt objektummá szerettetek volna alakítani.  Ez a megoldás rendkívül hasznos,  s gyakran …

  • A következőkben egy olyan, általam írt PHP-s függvényt szeretnék bemutatni, amellyel könnyedén és egyszerűen készíthetünk magunknak olyan oldalt, amely támogatja …

  • Személy szerint már sokszor jártam úgy, hogy egy eredményt, ami várhatóan egy tömb volt be kellett járja. Ilyen esetekben általában meg szoktuk vizsgálni, hogy a …

  • Nem tutorial, egyszerűen csak egy gyűjtés, mert szükségem volt egy magyar “stop words” állományra és a neten egy nagyobb, teljes anyagot nem találtam, így összeg …

  • Az Adattípusok PHP-ben című leírásban végignéztük, hogy egy-egy kifejezés milyen típusú lehet; néhány helyen jeleztem, hogy majd lesz szó a típus-konverzióról is …

A cikket beküldte: Harder (http://blog.harder.hu)

2 hozzászólás

  1. gyuri says:

    Szia ezt a hiba üzit kapom miért?

    1
    
    Warning: Invalid argument supplied for foreach() in C:xapmppxampphtdocsloginindex2.php on line 23

    És ez van a 23-ik sorba

    1
    
    foreach ($output as $result) {
  2. gyuri says:

    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?

Szólj hozzá
a Keresés szövegben c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>