this would to work with any language, i hope.
tested on czech (eastern europe) lang.
* SAFE HIGHLIGHT
****************************************/
/**
* function finds and encase every string in a $needleArr array with
* strings $shearLft (from the left side) and $shearRgt (guess from which
* side).
* already encased needles are IGNORED for any other step, so order
* of needles in $needleArr is pretty important.
*
* function is searching needles in case-insensitive mode,
* but case in the subject is saved.
*
* can you do it better? so, do it.
*
* @param array $needleArr array of needles
* @param string $shearLft left shear
* @param string $shearRgt right shear
* @param string $subject subject
* @param string $encoding encoding ('utf-8' is default)
*
* @author griffin
*/functionsafeHighlight($needleArr,$shearLft,$shearRgt,$subject,$encoding='utf-8')
{// encoding$e=$encoding;// oh, no needlesif( !is_array($needleArr))
return$subject;// empty keys throw-off, only unique, reindex$nA=array_values(array_unique(array_diff($needleArr, array(''))
)
);// needle countif( !($nC=count($nA)))
return$subject;// nothing to hl
// shear lengthif( !(($rLL=mb_strlen($rL=$shearLft,$e))
+ ($rRL=mb_strlen($rR=$shearRgt,$e))))
return$subject;// no shears
// subject lengthif( !($sL=mb_strlen($s=$subject,$e)))
returnnull;// empty subject
// subject in lowercase (we need to aviod
// using mb_stripos due to PHP version)$sW=mb_strtolower($s,$e);// masking ~ 0=not changed, 1=changed$m=str_repeat('0',$sL);// loop for each needlefor($n=0;$n
{// needle string loWercase$nW=mb_strtolower($nA[$n],$e);$o=0;// offset$nL=mb_strlen($nW,$e);// needle length
// search needlewhile(false!== ($p=mb_strpos($sW,$nW,$o,$e)))
{// oh hurrey, needle found on $p position
// is founded needle already modified? (in full-length)for($q=$p;$q
if($m[$q])
{// ai, caramba. already modified, jump over$o+=$nL;// continue for while() loop - not for for() loop!continue2;
}// explode subject and mask into three parts
// partA|needle|partB$sE[0] =mb_substr($s,0,$p,$e);$sE[1] =mb_substr($s,$p,$nL,$e);$sE[2] =mb_substr($s,$p+$nL,$sL-$p-$nL,$e);// mask
// partA|partB (needle not needed)$mE[0] =mb_substr($m,0,$p,$e);$mE[1] =mb_substr($m,$p+$nL,$sL-$p-$nL,$e);// apply shears$sE[1] =$rL.$sE[1].$rR;// update sunject length$sL+=$rLL+$rRL;// update mask$m=$mE[0] .str_repeat('1',$rLL+$nL+$rRL) .$mE[1];// implode into a subject$s=implode($sE);// update lowercase subject$sW=mb_strtolower($s,$e);// increase offset$o+=$rLL+$nL+$rRL;// end of string reachedif($o>=$sL)
break;
}// while()}// for( $n=0; $n
// oouu yeaaa, kick the subject out of the functionreturn$s;
}// function safeHighlight()
/****************************************
* END: SAFE HIGHLIGHT
****************************************/?>