Undgå replace af ord, når de optræder i URL
I mit forum har jeg en funktion, der søger teksten igennem og hvis der i teksten er nogle bestemte "opslagsord" så tilføjes en beskrivelse som vises når musen er over opslagsordet og samtidig bliver opslagsordet til et link. Virker fint. Men når et opslagsord indgår i en URL, så bliver det også lavet om og det er ikke så heldigt. Eksempelvis www.opslagsord.net , her skulle opslagsord ikke så gerne blive lavet om til et link. Så hvordan undgåes dette. Det vil være ok, hvis det dot der står foran opslagsordet gør at det ikke bliver lavet om.Funktionen bruger preg_replace og str_replace, men jeg kan ikke overskue hvor undtagelsen med . skal puttes ind.
Koden er
function do_gloss($message)
{
global $glosswords,$trreplace,$db_prefix,$modSettings;
if ($modSettings['gloss_enabled'] == 1)
{
// load glossary
if (is_null($glosswords))
{
// Define Options for the Tooltip
// More Informations regarding the params can be found here:
// http://www.bosrup.com/web/overlib/?Command_Reference
$tooltip = array( 'WIDTH' => 350,
'OFFSETX' => 20,
'BGCOLOR' => '#000000',
'FGCOLOR' => '#FFFFFF',
'TEXTCOLOR' => '#006090' );
foreach ($tooltip as $key=>$value)
{
if (is_integer($value))
$tt[] = $key.','.$value;
elseif (is_string($value))
$tt[] = $key.',\''.$value.'\'';
}
$options = join(',',$tt); if ($options!='') $options = ','.$options;
$result = db_query('SELECT gloss_id, gloss_word, gloss_desc, gloss_link, gloss_match FROM '.$db_prefix.'glossary', __FILE__, __LINE__);
$glosswords = array();
$trreplace = array();
while ($row = mysql_fetch_assoc($result))
{
$glosswords[] = array('id' => $row['gloss_id'],
'search' => preg_quote($row['gloss_word']),
'icase' => $row['gloss_match']);
$trreplace['%%GLOSS:'.$row['gloss_id'].'%%'] = '<a href='.$row['gloss_link'].' onmouseover="return overlib(\''.str_replace('"','"',str_replace("\r",'',str_replace("\n",'',addslashes(nl2br($row['gloss_desc']))))).'\''.$options.');" onmouseout="return nd();"><u><b>';
}
mysql_free_result($result);
}
// s&r
if (count($glosswords)>0)
{
foreach ($glosswords as $gloss)
{
$r = '%%GLOSS:'.$gloss['id'].'%%';
$s = $gloss['search'];
$message = preg_replace("/((<[^>]*)|\b$s\b)/".(((int)$gloss['icase'] == 0) ? 'i' : '')."e", '"\2"=="\1"? "\1":"{$r}\1</u></b></a>"', $message);
}
$message = strtr($message,$trreplace);
}
}
return $message;
}
