webForumDet fria alternativet

Preg_replace som ska sätta in rätt bildsökvägar

PHP

17 svar · 460 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Hej! Har ett litet problem jag skulle behöva lite hjälp med.

Jag vill använda mig av en tagg som ser ut så här i mina artiklar som jag har lagrade i min databas:
KLAMMERHÖGERIMGKLAMMARVÄNSTER1KLAMMERHÖGER/IMGKLAMMERVÄNSTER. Kunde inte skriva ut klamrarna eftersom wF använder sig av dessa. Sorry!

1 refererar till bildID i databastabellen. När en artikel nu laddas vill jag med preg_replace läsa av vilken siffra som står mellan taggarna så att jag kan anropa en annan funktion som hämtar ut sökvägen till aktuell bild samt bildbeskrivning med mera och skapar en färdig <img src>-tag som skriver över uttrycket jag beskrev ovan.

Med preg_match har jag lyckats få ut siffran som står mellan taggarna med följande regexp-uttryck:

preg_match("'\[IMG](.*?)\[\/IMG\]'",$text, $result);

Vet dock inte riktigt hur det fungerar när jag ska använda mig av preg_replace-funktionen. Någon som kan hjälpa mig på traven? :)

Medlem sedan aug. 20002 975 inlägg
#2

Om jag förstod dig rätt så borde det gå att köra något i stil med:

$text = preg_replace("/\[IMG](.*?)\[\/IMG]/ie", "funktionsnamn('$1')",$text);
Medlem sedan apr. 20041 597 inlägg
#3

Tror att du förstod mig rätt. Vill att när jag finner IMG-uttrycket ska först siffran som står där imellan läsas av och skickas till en funktion som returnerar en sträng med rätt länk som ersätter hela IMG-uttrycker med klamrar och allt! Klarar preg_replace av det? Eller måste jag använda mig av preg_match för att först hitta och läsa av siffran? :OO

Medlem sedan aug. 20002 975 inlägg
#4

preg_replace ska klara av det. Ett exempel:

function myFunc($num)
{
   return $num * 100;
}

$text = "Mary had &#091;IMG]22[/IMG] little lamb.";

$text = preg_replace("/\[IMG](.*?)\[\/IMG]/ie", "myFunc('$1')",$text);

echo $text;
Medlem sedan apr. 20041 597 inlägg
#5

Matte skrev:

preg_replace ska klara av det. Ett exempel:

function myFunc($num)
{
   return $num * 100;
}

$text = "Mary had &#091;IMG]22[/IMG] little lamb.";

$text = preg_replace("/\[IMG](.*?)\[\/IMG]/ie", "myFunc('$1')",$text);

echo $text;

Jag e helt med på ditt exempel så när som på en liten sak. När man nu kör preg_replace och den upptäcker den första IMG-taggen ska den ju "fånga upp" 22 så att myFunc i sin tur kan matas med det numret eftersom det symboliserar ID-numret på en bild.

Som det är nu, vilket variabel innehåller värdet "22"?

Medlem sedan aug. 20002 975 inlägg
#6

Första parentesens värde, representeras av $1.

Medlem sedan apr. 20041 597 inlägg
#7

Matte skrev:

Första parentesens värde, representeras av $1.

Är det så funktionen preg_replace är uppbyggd, att resultatet från regexp-uttrycket alltid matas till variabeln $1?

Medlem sedan aug. 20002 975 inlägg
#8

Hela uttrycket i $0, första parentesen i $1, andra parentesen i $2 o.s.v.

Medlem sedan apr. 20041 597 inlägg
#9

Det fungerar klockrent Matte! Tack så jättemycket för hjälpen. :)

Medlem sedan apr. 20041 597 inlägg
#10

Jag fortsätter på denna tråd då mitt nuvarande problem är en fortsättning på detta som beskrivits ovan. Som det är nu går detta preg_match-uttryck igenom en hel artikel/textmassa och plockar ut alla nummer som finns omslutet av IMG-taggar. Nu håller jag på och skapar en "Senaste artikel-funtion" till min första sida som visar de 3 senaste artiklarna. Nu tänkte jag ha med en bild till varje artikel för att göra sidan mer levande.

Det jag skulle vilja åstadkomma är en variant på nuvarande uttryck så att preg_match-funktionen enbart plockar ut det första siffervärdet i en IMG-tag så att jag sedan kan matcha detta värde mot rätt bild i databasen. Hur kan man lösa detta?!

:)

Medlem sedan aug. 20002 975 inlägg
#11

Om jag förstod dig rätt så vill du hämta värdet i den första img-taggen i texten ?

Då borde det funka med något i den här stilen:

preg_match("/\[IMG](.*?)\[\/IMG]/i", $text, $match);

$bild = !empty($match[1]) ? $match[1] : 'default';
// Fanns ingen img-tagg, använd default-bild
Medlem sedan apr. 20041 597 inlägg
#12

Matte skrev:

Om jag förstod dig rätt så vill du hämta värdet i den första img-taggen i texten ?

Ja, det är helt rätt!

Matte skrev:

preg_match("/\[IMG](.*?)\[\/IMG]/i", $text, $match);

$bild = !empty($match[1]) ? $match[1] : 'default';
// Fanns ingen img-tagg, använd default-bild

Hur fungerar detta uttryck med empty ? $match och default?

Medlem sedan mars 20034 471 inlägg
#13

lillebror skrev:

$bild = !empty($match[1]) ? $match[1] : 'default';

Hur fungerar detta uttryck med empty ? $match och default?

villkor ? om_sant : om_falskt

motsvarar:

if (villkor) om_sant
else om_falskt

Alltså:
!empty($match[1]) ? .... <--> Om $match[1] inte är tom, använd den, annars en defaultbild. :)

Medlem sedan apr. 20041 597 inlägg
#14

Funktionen fungerar bra om man kollar på sidan https://www.flygfyren.nu/index.php. Dock är det en artikel som inte har någon img-tag i sig med bildnummer och det blir knas när $bild-variabeln kommer tom till SQL-satsen. Försökte förebygga det med en if-sats men det blir något fel ändå.

Någon som ser vad det är i koden:

preg_match("/\[IMG](.*?)\[\/IMG]/i", $article['content'], $match);
$bild = !empty($match[1]) ? $match[1] : 'default'; 
#echo "Bildnummer: ".$bild;		
if($bild <> '') { 
$sqlSelect = "SELECT * FROM tblpicturesthumbnails where thumbnailID = ".$bild."";
$RSobj = mysql_query($sqlSelect) or die (mysql_error());
$picture = mysql_fetch_array($RSobj);
} else {
$picture = NULL;
}
Medlem sedan mars 20034 471 inlägg
#15

Ja, alltså, vill du att det ska stå 'default' om ingen bild finns? Jag tror Matte menade att du skulle ersätta den texten med vad du vill ska hända då? :q

Så som det för närvarande ser ut borde det nog bli:

if ($bild != 'default') { //i stället för != ''
  //...
}
else {
  $picture = NULL;
}
Medlem sedan apr. 20041 597 inlägg
#16

Får fortfarande detta fel i SQLn:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Detta tolkar jag som att SQL-satsen får fel invariabel som den inte kan hantera...

Medlem sedan aug. 20002 975 inlägg
#17

Ändra till:

$bild = !empty($match[1]) ? $match[1] : '';
Medlem sedan apr. 20041 597 inlägg
#18

Problemet löste sig...ändrade lite på ett villkor i if-satsen som skriver ut bilden...

Nu fungerar det fint!

Tack för hjälpen!

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