Maximum execution time of 30 seconds exceeded hiba
Van egy ilyen forráskódrészletem, amelyben a keresés során talált szövegekben az összes keresett szó összes előfordulását kiemeli a mark html tag-gel:De a fenti hibát produkálja. És az a gáz, hogy ha a mark helyett em-et írok már jó, de ha egy 3 karakteres html tag-gel emelem ki (mondjuk próba képpen a sup) akkor már jó, sőt ha a nyitó vagy a záró markból csak egyetlen karaktert is kiemelek, akkor sem ír már hibaüzenetet. Pont azzal az egyetlen karakterrel lesz tele a hócipője.
■
$j=1;
mysql_data_seek($lekerdezes,0);
while ($rekord=mysql_fetch_array($lekerdezes))
{
$szoveg=$rekord['szoveg'];
for ($k=0; $k<count($keresendok); $k++)
{
$keresendo_hossz=mb_strlen($keresendok[$k],'UTF-8');
$alap_poz=0;
while (mb_strpos(mb_strtolower($szoveg,'UTF-8'),mb_strtolower($keresendok[$k],'UTF-8'),$alap_poz,'UTF-8')!==false)
{
$szoveg_hossz=mb_strlen($szoveg,'UTF-8');
$kezdo_poz=mb_strpos(mb_strtolower($szoveg,'UTF-8'),mb_strtolower($keresendok[$k],'UTF-8'),$alap_poz,'UTF-8');
$veg_poz=$kezdo_poz+$keresendo_hossz;
$szoveg=mb_substr($szoveg,0,$kezdo_poz,'UTF-8') . "<mark>" . mb_substr($szoveg,$kezdo_poz,$keresendo_hossz,'UTF-8') . "</mark>" . mb_substr($szoveg,$veg_poz,$szoveg_hossz,'UTF-8');
$alap_poz=$veg_poz+1;
}
}
echo " <p><strong>" . $j++ . ".</strong> " . $szoveg . " <em><a href='valami_link.php'>" . $valami . "</a></em></p>\n";
}
Próbálhatnál kevesebb
Például, az 5. sorban a "szoveg" változót rögtön lehetne alakítani, nem minden egyes előfordulási ponton. A "keresendo" tömbről ugyanez elmondható, a 8. sorban használod, a "dataseek" előtt már előkészített állapotban lehetne.
+1
– a szoveg_hossz-t elég a legkülső ciklusban kiszámolni,
– ugyanez igaz az mb_strtolower(szoveg)-re
– Én lehet, hogy megpróbálnék egy mb_ereg_replace -et case insensitive-en használni (az mb_eregi_replace-nál pont szerepel a problémád a hozzászólások közt)
– Csúnya megoldás, ha tényleg másik taget használsz, és CSS-re bízod a maradékot :P
str_replace
Arra gondolok, hogy a $keresendok tömbből először építeni kellene mondjuk egy $kiemelesek tömböt, amely a keresendő szavakat az elvárt alakban (<mark>szo</mark>) tartalmazza, és utána egy egyszerű str_replace($keresendok, $kiemelesek, $szoveg) függvényhívással megoldhatnád az egészet:
Kis- és nagybetűk
preg_replace
Viszont az igaz, hogy a case sensitiveness miatt nem is fogja kiemelni a csak kis-nagybetűből fakadó eltéréseket.
De akkor javaslok egy még egyszerűbb megoldást preg_replace-el, mert ez tutin kezeli az utf8-at is és a case eltérést is bármely karakteren:
Ez a megoldás egészen addig jó lesz, amíg az biztos, hogy a $keresendok tömb biztosan csak szavakat/szórészleteket tartalmaz. Arra figyelni kell, hogy amennyiben regexp-pattern kerül bele, akkor az boríthatja a keresést/cserét.
preg_quote
preg_quote a keresendő mintákban előforduló speciális jelentésű dolgokat is biztonságosan fogyaszthatóvá teszi későbbi mintaillesztésre.