Keresés html-t tartalmazó mezőben - mysql

Nézzük meg, hogy hogyan lehet keresni egy olyan mezőben, amiben html-t tárolunk - például egy TinyMCE által szerkeztett tartalamat -, és szeretnénk keresni az “árvíztűrő tükörfúrógép”-re, de azt a szerkesztő így írta le: “árvíztűrő <b>tükörfúrógép</b>”. A válasz egyszerű: sehogy. Értelmesen, erőforrást kímélve sehogy. A mysql regexp eleve buta, soronként nézni a táblát megintcsak rossz. A megfejtés egy plusz mező segítségül hívása, ami tartalmazza a html szöveg tag-ek és írásjelek nélküli verzióját. Ismét nem spanyol viasz, de a kezdő cms fejlesztőknek jól jöhet a tipp. Lássuk hogy!

Ott tartunk, hogy a $_POST["content"] változóban megvan a postolt html szöveg, két dolgot kell tenni:

  1. eltávolítani a html tagokat
  2. eltávolítani az írásjeleket

HTML tag-ek eltávolítása:

function html2text($dokumentum) {
$mit = array ("'<script[^<]*?>.*?</script>'si",
"'<[\/\!]*?[^<>]*?>'si",
"'([\r\n])[\s]+'",
"'&(quot|#34);'i",
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(\d+);'e");

$mire = array ("",
"",
" ",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");
return htmlspecialchars(preg_replace ($mit, $mire, $dokumentum));
}

Majd az írásjelek eltávolítása:

function keyword_extract($text){
   $nohtml = array(""","<",">");
   $html = array("\"","<",">");
   $text = str_replace($nohtml,$html, $text);
   $text = strtolower($text);
   $punc =". , : ; ' ? • ! | ( ) \" \\ < > { } /";
   $punc = explode(" ",$punc);
   foreach($punc as $value){
     $text = str_replace($value, " ", $text);
   }
   $text = str_replace("  ", "", $text);
   $keywords = explode(" ", $text)
   foreach ($keywords as $index => $value) {
     $keywords[$index] = trim($keywords[$index]);
     if ($keywords[$index]=="") unset($keywords[$index]);
   }
   return implode(" ",$keywords);
}

Használat:

$plain_content = html2text($_POST["content"]);
$plain_content = keyword_extract($plain_content);

$plain_content tartalmazza a tiszta szöveget, ami mehet a plusz mezőnkbe. A megszokott “like ‘%valami szöveg%’ ” formában kereshetünk. Ne feledjük indexelni ezt a mezőt.

1 hozzászólás

  1. raszputyin, 2008. május 23., 17:20

Új hozzászólás: