webForumDet fria alternativet
Logga in / Bli medlem

Modifiera en funktion.

PHP

11 svar · 663 visningar · startad av Troll

Medlem sedan dec. 2003229 inlägg
Trådstart#1

Hejsan!

Skulle behöva hjälp med 2 saker, först och främst vore det trevligt att veta om koden som kommer är bra eller om den bör skrivas om för att bli mer effektiv och hjälp med att fixa så att själva orden inte ändrar på sig.

Ok...

Denna kod använder jag för att skapa länkar av ord i en text:

function makeWordLink($text) {

db_connect();
$ord = array();
$ord_query = "SELECT oWord FROM tbl_words";
$row_ord = mysql_query($ord_query) or die(mysql_errno().' '.mysql_error());
while( $a = mysql_fetch_array($row_ord) ) {
   $ord[] = $a['oWord'];
}
   foreach ($ord as $value) {

      if (strpos($text, $value) !== false) {
         $replace = "<a href=\"/ordlistan/".substr($value,0,1)."/$value/\"\">$value</a>";
         $text = str_ireplace($value, $replace, $text);
      }
   }

   return $text;
}

$Texten = "En massa text från databasen som ska påverkas";

echo makeWordLink($Texten);

Det funkar prima men problemet är att orden i texten ändras, tex:
Ordet från oWord är 'Öl' och i texten finns ordet 'Mjölk', då skrivs texten ut såhär: MjÖlk. Det vill jag ju inte, jag vill att ord i ord ska påverkas men inte ändras sådär. Förstår ni?

Tacksam för all hjälp jag kan få!

Medlem sedan mars 20023 561 inlägg
#2

Om du vill att ord i ord ska ändras blir det svårt. Då måste ju funktionen veta vad som är ett eget ord inbakat eller om bara samma bokstäver i samma följd förekommer i ett "eget" ord.

Skulle gissa på att det är ganska omöjligt om man inte skall implementera hela ordlistan och veta vilja ord som finns och vilka ord som i sin tur består av flera ord.

Medlem sedan dec. 2003229 inlägg
#3

Jomen alltså, ord som finns i ord blir ju påverkade som jag vill om man bortser från stora/små bokstäver. Eller missuppfattade jag dig helt nu?

Det enda som inte funkar som jag vill är just att om man skriver ordet 'MJÖLK' i en text så ska det bli formaterat om ordet 'Mjölk' finns i ordlistan. Det funkar. Men problemet är att istället för att skriva ut 'MJÖLK' så skrivs det ut 'Mjölk'.

Hänger du med hur jag menar?

Medlem sedan dec. 2003229 inlägg
#4

Jag tar och återupplivar denna tråd.

Har fortfarande inte fått detta att funka som jag vill, den hittar och byter ut ord som den ska men enbart om det är EXAKT som det är i databasen, ibland skrivs ju orden med små bokstäver och då funkar det inte :( Ingen som har några tips?

Medlem sedan dec. 2003229 inlägg
#5

Yay! En liten bit påväg iaf, använde strripos() istället och då hittades även ord som har stora/små bokstäver, kruxet är dock när själva länkningen sker så ändras ordet så att det ser ut som det gör i databasen :(

Någon som kan peka åt rätt håll?

Medlem sedan juni 200032 967 inlägg
#6

Hur ser koden ut nu då?

Medlem sedan dec. 2003229 inlägg
#7
$ord = array();
$ord_query = "SELECT oWord FROM tbl_words";
$row_ord = mysql_query($ord_query) or die(mysql_errno().' '.mysql_error());
while( $a = mysql_fetch_array($row_ord) ) {
   $ord[] = $a['oWord'];
}
   foreach ($ord as $value) {

      if (strripos($text, $value) !== false) {
         $replace = "<a href=\"/ordlistan/".substr($value,0,1)."/$value/\"\">$value</a>";
         $text = str_ireplace($value, $replace, $text);
      }
   }

Samma lika, bara strripos() istället för strpos().

Jag tycker att det inte borde vara omöjligt med tanke på att man kan jämföra två strängar och kolla om det är samma utan att det ska vara case sensitive, man _borde_ ju kunna använda sig av något liknande i detta fall hoppas jag.

Medlem sedan sep. 200619 inlägg
#8

använd regular expressions som t.ex preg_replace()

Din funktion kan då kortas ner till exempelvis detta:

function makeWordLink($text) {

	$ord_query = "SELECT oWord FROM tbl_words";
	$row_ord = mysql_query($ord_query) or die(mysql_errno().' '.mysql_error());
	
	while($a = mysql_fetch_array($row_ord)) {
	
	   $ord = $a['oWord'];
	   $text = preg_replace("/($ord)/ise", '"<a href=\"/ordlistan/" . substr("\\1", 0, 1) . "/\\1\">\\1</a>"', $text);
	   
	}
	
return $text;

}

$Texten = "En massa text från databasen som ska påverkas";
echo makeWordLink($Texten);
Medlem sedan dec. 2003229 inlägg
#9

Mjo det funkar ju finemang men är det verligen regexp att föredra, något säger mig att det är snabbare och mindre krävande att köra på tanken jag hade. Eller så har jag tolkat saker och ting lite fel.

Tänkte på om det körs på relativt stora texter och med många ord som påverkas.

Men ett stort tack för hjälpen! Får köra med det tills jag får klarhet i det hela :)

Medlem sedan dec. 2003229 inlägg
#10

Verkar dock inte fungera om man har ord som innehåller åäö :(

Medlem sedan sep. 200619 inlägg
#11

Troll skrev:

Ordet från oWord är 'Öl' och i texten finns ordet 'Mjölk', då skrivs texten ut såhär: MjÖlk. Det vill jag ju inte, jag vill att ord i ord ska påverkas men inte ändras sådär. Förstår ni?

Om du inte vill att ovanstående ska ske, då är preg_replace() att föredra.

Medlem sedan dec. 2003229 inlägg
#12

Mjo det verkar så, man kan inte få allt :)

Har du någon lösning på åäö-biten?

266 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)