Avatar billede Allan Juniormester
08. december 2021 - 10:48 Der er 8 kommentarer

Virker dårligere og dårligere

PHP var tidligere et rigtigt godt værktøj, men efterhånden er der mindre af det, der fungerer. Følgende har virket upåklageligt i 10 år, men nu går programmet ned på det. Hvorfor?
  for ($i = 0; $i < strlen($indhold); $i++) {
    if (substr($indhold, $i, 9) == '[Billede:') {
      $k = 0;
      for ($j = $i + 9; $j < strlen($indhold); $j++) {
        if (substr($indhold, $j, 1) == ']') {
          break;
        } else {
          $k++;
          $billednavn = substr($indhold, $i + 9, $k);
        }
      }

      if ($side == 'venstre') {
        $side = hojre;
      } else {
        $side = venstre;
      }

      $indhold = substr($indhold, 0, $i).
                '<p align='.chr(34).'center'.chr(34).'><img src='.chr(34).'../billeder/'.
                $billednavn.chr(34).' width=300 class='.chr(34).$side.chr(34).'></p>'.
                substr($indhold, $j + 1);
    }
  }

Hvis der et sted i en tekststreng står [Billede:eksempel.png], skal det pågældende billede vises med teksten før og efter.
Avatar billede claes57 Ekspert
08. december 2021 - 12:17 #1
Uden at kende til php, så er version 7.3 udgået her i december, så nogle udbydere har rettet i domæneindstillinger, så 7.4 eller 8 er minimum.
Så tjek domæne, og test koden/kommandoer, at de findes i 8 også.
Avatar billede Henrik Hansen Forsker
08. december 2021 - 13:01 #2
Regex kan løse denne opgave med få linier kode (men kan være lidt svær at forstå): https://regexr.com/

$indhold = 'Hvis der et sted i en tekststreng står [Billede:/images/eksempel.png|left], skal det pågældende billede [Billede:eksempel_2.jpg|right] vises med teksten før og efter.';

$find_str = '/\[Billede\:(\S+)\.(png|jpg|jpeg|gif)\|(left|right)\]/i';
$erstat_med = '<img src="\1.\2" class="\3">';

$nyt_indhold = preg_replace($find_str, $erstat_med, $indhold);


Her vist uden <p>, width m.m. , da dette kan/bør gøres via CSS. Jeg tilføjede også mulighed for at definere "side" på hvert billede.  |left --> class="left"  (kan bedre lide engelske ord til css, men det kan omdøbes efter behov)

PS:
Man kan køre/vise php-kode med gammel php-version, men det anbefales at holde server opdateret med den slags, da gamle versioner kan have sikkerhedshuller, og nyere versioner som regel er bedre optimeret. Og så bliver der jo fundet nye/bedre måder at løse samme opgaver.
Avatar billede Allan Juniormester
08. december 2021 - 14:39 #3
Det ser smart ud at kunne klare opgaven på blot 3 linjer; men som du skriver, er det meget svært at forstå. Fik det ikke til at virke i flere forsøg. Løste det her og nu ved at skrive <img ... koden direkte i teksten. Mange gamle indlæg skal dermed rettes op på en besværlig måde.
Ifølge https://www.php.net/manual/en/function.substr.php burde både chr(), substr() og strlen() også virke i PHP 8, så jeg forstår ikke, hvad der får mit oprindelige program-del til at gå ned?
Avatar billede ejvindh Ekspert
08. december 2021 - 15:23 #4
Hvad mener du med, at det går ned? Et godt trick til at fejlfinde er jo at lægge nogle "echo"-sætninger ind undervejs i koden, så man hele tiden kan holde øje med om den gør det, man regner med.

Umiddelbart vil jeg gætte på at følgende linjer ikke gør, hvad du regner med, da der vist mangler nogle anførselstegn på højre side af 2.+4. linje:

      if ($side == 'venstre') {
        $side = hojre;
      } else {
        $side = venstre;
      }

Og jeg tror i hvert fald ikke det har noget at gøre med, at PHP ikke længere skulle være et godt programmeringssprog...
Avatar billede ejvindh Ekspert
08. december 2021 - 15:27 #5
Noget du måske skal holde øje med er at med php8 fungerer string-sammenligninger på en ny måde. Se "Warning" lidt nede på denne side:
https://www.php.net/manual/en/language.operators.comparison.php

Jeg vil anbefale dig at bruge strcmp i stedet for "==" når du sammenligner strenge.
Avatar billede arne_v Ekspert
08. december 2021 - 16:06 #6
PHP bliver faktisk et bedre sprog over tid.

if ($side == 'venstre') {
        $side = hojre;
      } else {
        $side = venstre;
      }

giver en notice i PHP 5, en warning i PHP 7 og en error i PHP 8.

Det vil jeg kalde en forbedring!
Avatar billede Allan Juniormester
08. december 2021 - 16:36 #7
Godt observeret. Der har været en fejl, som PHP blot har accepteret hidtil. Ved at tilføje apostroffer virker det nu. Tak alle sammen.
Jo, jeg benytter echo'er og udelader områder med /* ... */ for at finde frem til problemerne, hvor programmet går i stå. Det fangede blot ikke lige denne sag. Og da det som sagt havde fungeret i mange år, kunne jeg slet ikke tænke den tanke, at der var noget galt med syntaksen.
Forhåbentlig er det noget tilsvarende, der gør sig gældende på en anden underside, som har samme skavank. Jeg tjekker.
Avatar billede arne_v Ekspert
08. december 2021 - 16:51 #8
Når du tester lokalt så få PHP til at vise alle fejl typer.

Og fix alle fejl inden upload til server.
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

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