webForumDet fria alternativet

Regexp och markering av sökträffar

PHPur PHP

8 svar · 631 visningar · startad av Web-Tor

Medlem sedan nov. 200013 890 inlägg
Frågan#1

Jag använder den här koden för att markera sökträffar på sida:

<?
function highlight ($str, $Search){ 
	if (isset($Search))
		$str = preg_replace ( "/(.*?)(" . $Search . ")(.*?)/is", "\\1<b>\\2</b>\\3", $str ); 
	return $str; 
}

?>

<?=highlight($row[0], $Search)?>

Men det uppstår ett litet fel. Om texten som söks igenom ser ut så här:

En massa text <span class="text">står här<span>

Söker jag på 'text' så kommer ju källkoden se ut så här efter att sökordet markerats:

En massa <b>text</b> <span class="<b>text</b>">står här<span>

Och det blir ju inte så bra. Alltså:
Hur utesluter jag taggar ur min "highlight-funktion"???

Medlem sedan mars 20007 896 inlägg
#2

Pröva:

$str = preg_replace( "'<(.*?)>(" . $Search . ")</(.*?)>'is", "<b>\\2</b>", $str );

Se bara till så att användare inte kan använda < och > i sina texter.

Medlem sedan nov. 200013 890 inlägg
#3

Nja... Det funkar inte. Ingenting markeras :q

Medlem sedan jan. 2000224 inlägg
#4

Detta var precis vad jag letat efter Web-Tor.. Synd att det inte fungerar bara..
När jag kör det så blir det bara knas tyvärr.

ex:

 $str = "Detta är text" 
 $search = "text"
 
 detta ger....

 $str = "Detta är en []"

Ser ingen som helst logik bakom detta men det kanske beror på att jag är kass på regexp också. Någon som har en lösning på detta. Det skulle underlätta.

Medlem sedan feb. 20001 050 inlägg
#5

Så här:

<?
function highlight ($str, $Search){
if (isset($Search))
$str = preg_replace ( "/(<.*?>|)([^<^>]*?)(".$Search.")([^<^]*?)(<.*?>|[^<^>]*?>)/mis", "\\1\\2<b>\\3</b>\\4\\5", $str );
return $str;
}

$str="En massa text <span class=\"text\">\nstår här<span>";
$Search="text";
echo highlight($str, $Search);
?>

tror jag att det skall fungera. Prova!

PS Det är inte så bra att lagra HTML:en i "databasen", det hade blivit mycket enklare som du lagrat texten för sig och HTML-koden för sig.... DS

/nicclas - https://www.frisim.com

Medlem sedan nov. 200013 890 inlägg
#6

Nu är jag tebaka från semestern och får ta tag i det här igen:
Din kod funkar inte till 100% Nicclas

Sättar man $str så här så blir det fortfarande fel:

$str="<p><img src=\"bild.gif\" alt=\"En bild med text på\"></p>";

Här kommer ordet 'text' i alt-texten att få <b>-taggar runt sig. :l

Det blir alltså fel när en tagg ligger i en annan utan att det finns några tecken mellan taggarna. Fattar ni?

Medlem sedan feb. 20001 050 inlägg
#7

Oj lite slarvigt, jag missade ett >-tecken där mitt i :)

Prova med detta:
<?
function highlight ($str, $Search){
if (isset($Search))
$str = preg_replace ( "/(<.*?>|)([^<^>]*?)(".$Search.")([^<^>]*?)(<.*?>|[^<^>]*?> )/mis", "\\1\\2<b>\\3</b>\\4\\5", $str );
return $str;
}

$str="<p><img src=\"bild.gif\" alt=\"En bild med text p\"></p>";
$Search="text";
echo highlight($str, $Search);
?>

/nicclas - https://www.frisim.com

Medlem sedan nov. 200013 890 inlägg
#8

Du é kung på regexp Nicke! :)

Medlem sedan dec. 1999483 inlägg
#9

Vet att tråden är gammal men jag har ett problem med funktionen.

$str = preg_replace ( "/(<.*?>|)([^<^>]*?)( )([^<^>]*?)(<.*?>|[^<^>]*?> )/mis", "\\1\\2<font color=\"#FFFFFF\" class=\"i\">i\\3</font>\\4\\5", $str);

För att byta ut alla mellanslag mot i + mellanslag. Självklart ska det inte göras i html-koden eftersom den inte funkar då. Däremot funkar det inte riktigt som den ska. Den ersätter bara vissa mellanslag. Det verkar som det är det första mellanslaget efter \n\n.

139 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)