Avatar billede alsvik Nybegynder
28. september 2008 - 01:45 Der er 13 kommentarer og
1 løsning

PHP replace

Jeg har en flash-app som forbinder til en database via php. Det virker fint - men nu har jeg brug for at hente kun én enkelt del fra min databse, og da jeg i sin tid satte det op lavede jeg muligvis en lidt dum ting... som jeg nu håber at nogen kan hjælpe mig ud af!?

Jeg skriver til en database i 4 forskellige rækker:
name, email, comments, time

(Det er en gæstebog app som jeg har lavet om til en blog, men jeg har bibeholdt de gamle navne)

I "name" er overskriften på seneste indlæg på min blog (og her kommer dumheden:) og et billede, indsat som <img src=...>

Nu vil jeg høre om man kan lave en php-replace funktion som henter "name", men fjerner alt andet end tagget <img src=...>?



Her er min php-kode:
(det er samme php-som bruges til at skrive til databasen. I denne henter den kun seneste entry i rækken "name" og gør teksten hvid i font "-7". Det er ikke helt optimalt!)

<?

// Part One - Initiate a mySQL Database Connection
// Database Connectivity Variables and other Variables
  $DBhost = "localhost";  // Database Server
  $DBuser = "domain_com";            // Database User
  $DBpass = "password";            // Database Pass
  $DBName = "domain_com";            // Database Name
  $table = "blog";            // Database Table
  $numComments = 1;      // Number of entries per page
 

  // Connect to mySQL Server
  $DBConn = mysql_connect($DBhost,$DBuser,$DBpass) or die("Error in App: " . mysql_error());
  // Select mySQL Database
  mysql_select_db($DBName, $DBConn) or die("Error in App: " . mysql_error());
// Part Two - Choose what action to perform
  $action = $_GET['action'];

  switch($action) {
      case 'read' :
        // Fetch all comments from database table
        $sql = 'SELECT * FROM `' . $table . '`';
        $allComments = mysql_query($sql, $DBConn) or die("Error in App: " . mysql_error());
        $numallComments = mysql_num_rows($allComments);

        // Fetch page-wise comments from database table
        $sql .= ' ORDER BY `time` DESC LIMIT ' . $_GET['NumLow'] . ', ' . $numComments;
        $fewComments = mysql_query($sql, $DBConn) or die("Error in App: " . mysql_error());
        $numfewComments = mysql_num_rows($fewComments);

        // Generate Output for Flash to Read
        print '&totalEntries=' . $numallComments . '&';
        print "&entries=";   

       

        if($numallComments == 0) {
            print "Ingen 'data'...";
        } else {
            while ($array = mysql_fetch_array($fewComments)) {
              $name = mysql_result($fewComments, $i, 'name');

              print '<p align="center"><font size="-7" COLOR="#ffffff">' . $name . '</font></p>';

              $i++;
            }
        }

        // Print this only when there aren't any more entries..

        if($_GET['NumLow'] > $numallComments) {
          print 'No More Entries!&';
        }
        break;

      case 'write' :
        // Recieve Variables From Flash
        $name = ereg_replace("&", "%26", $_POST['yourname']);
        $email = ereg_replace("&", "%26", $_POST['youremail']);
        $comments = ereg_replace("&", "%26", $_POST['yourcomments']);
        $submit = $_POST['submit'];

        // Current system date in yyyy-mm-dd format
        $submitted_on = date ("Y-m-d H:i:s",time());

        // Check if its submitted from Flash
        if($submit == 'Yes'){
        // Insert the data into the mysql table

        $sql = 'INSERT INTO ' . $table .
                ' (`ID`,
                  `name`,
                  `email`,
                  `comments`,
                  `time`
                  )

                  VALUES
                  (\'\','
                  . '\'' . $name . '\','
                  . '\'' . $email . '\','
                  . '\'' . $comments . '\','
                  . '\'' . $submitted_on . '\'
                  )';

        $insert = mysql_query($sql, $DBConn) or die("Error in GuestBook Application: " . mysql_error());

        print "&gb_status=Entry er oprettet.&done=yes&";
        return;
        }
        print "&_root.write.gb_status=Error!&";
        break;
  }
?>



Et eksempel på "name" er:
Google - opdatering <img src="http://domæne.dk/content/google.png" align="right">

Jeg ville meget gerne have fjernet alt andet end:
<img src="http://domæne.dk/content/google.png" align="right">

Og meget gerne omskrevet til:
<img src="http://domæne.dk/content/google.png">

Jeg går ud fra at du/i kan gætte jer til at både teksten og img-url er forskellig fra gang til gang!


Det er vist en ordenlig mundfuld - men kan du hjælpe mig er der gode point!!!
Avatar billede showsource Seniormester
28. september 2008 - 07:56 #1
Noget i denne stil

<?php

$str = 'Google - opdatering <img src="http://domæne.dk/content/google.png" align="right">';

$newStr = str_replace("align=\"right\"", "", $str);

$findimg = strpos($newStr, "<");

$newStr = substr($newStr,$findimg,strlen($newStr));

echo htmlspecialchars($newStr);

?>
Avatar billede moddi100 Seniormester
28. september 2008 - 11:44 #2
Eller sådan:

$str = 'Google - opdatering <img src="http://domæne.dk/content/google.png" align="right">';

preg_match("#<img[^>]+src=(['\"])(.+?)\\1#i", $str, $matches);

$img = '<img src="' . $matches[2] . '">';
Avatar billede alsvik Nybegynder
28. september 2008 - 15:56 #3
Som jeg ser det, har i begge arbejdet med den præcise streng i "name".
Men som jeg skriver: Jeg går ud fra at du/i kan gætte jer til at både teksten og img-url er forskellig fra gang til gang!

Et par eksempler:
Google - opdatering <img src="http://domæne.dk/content/google.png" align="right">
Super scoring <img src="http://domæne.dk/content/fck.png" align="right">
Nu med ny mobil ... <img src="http://domæne.dk/content/iphone.png" align="right">

Så str_replace skal vel arbejde med strengen '&name'?!

Jeg har meget lidt check på PHP, så en kode implementeret i ovenstående PHP ville være smukkere end smukt...
Avatar billede moddi100 Seniormester
28. september 2008 - 16:56 #4
Når jeg kommer tilbage om et lille kvarters tid, smider jeg et link op, der bruger min metode. Så vil du se at den virker. Hver gang.

Det den går er at den går ind og finder et billede tag '<img' og finder det nærmeste 'src=' hvor den så gemmer det efterfølgende...
Avatar billede moddi100 Seniormester
28. september 2008 - 17:38 #5
Her kan du se det: http://www.moddi.dk/regex.php

Kildekoden er som i 28/09-2008 11:44:30.
Avatar billede alsvik Nybegynder
28. september 2008 - 23:10 #6
det virker rigtig fint på din side! men jeg skal have det indkodet i min php ... Er det mon blot et spørgsmål om at indsætte din kode før "print" i min kode og så omdøbe str til name i din del af koden?
Avatar billede moddi100 Seniormester
29. september 2008 - 14:40 #7
Det kommer lidt anpå hvordan du vil have det. Sådan som jeg opfatter det, skal $navn kun indeholde billedet?

Så skal det være sådan:
--- Kode Som ovenstående ----

// Recieve Variables From Flash
$name = ereg_replace("&", "%26", $_POST['yourname']);
$email = ereg_replace("&", "%26", $_POST['youremail']);
$comments = ereg_replace("&", "%26", $_POST['yourcomments']);
$submit = $_POST['submit'];

preg_match("#<img[^>]+src=(['\"])(.+?)\\1#i", $navn, $matches); // Her kommer det
$navn = '<img src="' . $matches[2] . '">'; // Her tildeler vi $navn billedet

// Current system date in yyyy-mm-dd format
$submitted_on = date ("Y-m-d H:i:s",time());

// Check if its submitted from Flash
if($submit == 'Yes'){
...

--- Kode som ovenstående ---
Avatar billede moddi100 Seniormester
29. september 2008 - 14:49 #8
Hvis du ønsker at gemme både tekst og billede skal

preg_match("#<img[^>]+src=(['\"])(.+?)\\1#i", $navn, $matches); // Her kommer det
$navn = '<img src="' . $matches[2] . '">'; // Her tildeler vi $navn billedet

ændres til

preg_replace("#<img[^>]+src=(['\"])(.+?)\\1#i", "<img src='$2'>", $navn);
Avatar billede alsvik Nybegynder
29. september 2008 - 15:08 #9
Hrmm ... PHP'en fejler ikke, så det virker nok efter hensigten - men ...
Jeg tror vi nu har sat den ind på et tidspunkt i PHP-koden, hvor den påvirker det som indsættes i databasen.

De eksisterende rækker i databasen er korrekte og kun korrekt data tilskrives databasen. De data bruges også andetsteds og må ikke ændres.
Det er kun ved hentning via den php, at jeg vil have fjernet tekst og align osv. fra feltet '&name'.

Det er ellers super at du vil hjælpe moddi100 :o)
Kan du hjælpe mig med ny placering?
Avatar billede moddi100 Seniormester
29. september 2008 - 15:15 #10
Mig der misforstod det.

print '<p align="center"><font size="-7" COLOR="#ffffff">' . $name . '</font></p>';

Er vel der hvor der skal ændres:

print '<p align="center"><font size="-7" COLOR="#ffffff">' . preg_replace("#^.*<img[^>]+src=(['\"])(.+?)\\1.*$#is", "<img src='$2'>", $navn) . '</font></p>';

Jeg har omskrevet regex'et lidt, så det nu passer lidt bedre ind.
Avatar billede moddi100 Seniormester
29. september 2008 - 15:17 #11
> Det er ellers super at du vil hjælpe moddi100 :o)

Jeg får også hjælp en gang imellem, og så er det rart at kunne give lidt igen.
Avatar billede alsvik Nybegynder
29. september 2008 - 15:20 #12
Den sidder lige i øjet!!!

1000 tak. Point tildelt!
Avatar billede moddi100 Seniormester
29. september 2008 - 15:21 #13
Tak for point. :D
Avatar billede alsvik Nybegynder
29. september 2008 - 16:19 #14
Jeg fandt faktisk lige en lille ting mere ...
Men den har jeg oprettet i en ny tråd :"PHP replace string"

Jeg kan se at den nuværende php-kode efterlader align="right" i img-tagget.
Den del gad jeg godt slippe af med ... ?!

:o)
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