webForumDet fria alternativet

markera sökord i sträng - preg_replace

3 svar · 485 visningar · startad av learn

learnMedlem sedan jan. 20051 130 inlägg
#1

Jag har en sträng som kan se ut enligt följande:

$str = "<a href='test.php'>Jag är en sträng</a>"

Nu vill jag markera det som postas i ett formulär, t.ex:

$_POST['search'] = "sträng"

Så att strängen blir som följande:

$str = "<a href='test.php'>Jag är en <span>sträng</span></a>"

"Sökordet" kan förekomma flera gånger i strängen.

Hur gör jag?

Tack.

voigtann1Medlem sedan juni 20019 519 inlägg
#2
$str = preg_replace('/('.$_POST['search'].')/imx', '<span>$1</span>', $str);
learnMedlem sedan jan. 20051 130 inlägg
#3

Ah förlåt, jag glömde klargöra en viktig detalj... Sökordet får inte markeras inuti html taggar för då blir det ju knas...

Exempel:

$str = "<a href='test.php'>Jag är ett test</a>";

$_POST['search'] = "test";

$new_str = preg_replace('/('.$_POST['search'].')/imx', '<span>$1</span>', $str);;

Skulle ju i så fall bli:

$new_str = "<a href='<span>test</span>.php'>Jag är ett <span>test</span></a>"

....!

learnMedlem sedan jan. 20051 130 inlägg
#4

Jag byggde en funktion :)

// Tar emot ett sökord (str) och en sträng (str) att söka i
// Returnerar strängen där sökordet är markerat med <span>
// Funktionen tar hänsyn till HTML taggar (ev. markering görs ej inuti dessa)
function mark_string($search, $str)
{
	// Den nya strängen
	$new_str = "";
			
	// HTML tags pattern
	$pattern = "/([\<][\/]?[a|span|p|div|br|input|form].*?[ ]?[\/]?[\>])/";
			
	// Hitta alla HTML taggar och spara dem i arrayen $matches
	preg_match_all($pattern, $str, $matches);
			
	// Dela upp innehåll som inte är inuti i en HTML tag
	$content_arr = preg_split($pattern, $str);
				
	// Gå igenom alla delar
	foreach ($content_arr as $content)
	{
		// Markera alla förekomster av sökordet
		$new_str .= preg_replace("/($search)/i", "<span>$1</span>", $content);
				
		// Lägg till HTML tag
		$new_str .= current($matches[1]);	
				
		// Nästa HTML tag
		next($matches[1]);
	}
		
	// Returnera den nya strängen
	return $new_str;
}

In action:

$str = "Ordet html i en <a href='html.php'>html tag</a> funkar bra!";

$search = "html";

echo mark_string($search, $str);
// Ordet <span>html</span> i en <a href="html.php"><span>html</span> tag</> funkar bra!

Rätt stolt att jag lyckats, för det fungerar precis så som jag vill.

Men, den går säkert att optimera, kanske rent ut av det går att göra en preg_replace som gör allt detta med en gång?

Tacksam för synpunkter och tips.

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