Avatar billede fije Nybegynder
24. april 2008 - 17:15 Der er 1 kommentar

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('"','&quot;',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;

}
Avatar billede jakobdo Ekspert
24. april 2008 - 20:02 #1
Dit problem er her:

$message = preg_replace("/((<[^>]*)|\b$s\b)/".(((int)$gloss['icase'] == 0) ? 'i' : '')."e", '"\2"=="\1"? "\1":"{$r}\1</u></b></a>"', $message);

Og mere specifikt: \b$s\b

\b = boundary (mere info kan læses her: http://www.regular-expressions.info/wordboundaries.html)

Der skal du så evt. rette den preg_replace() til, så den ikke matcher .noget.
Problemet er så at en sætning kan ende på: vigtig. som er korrekt nok.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester