[php] sprintf probleem

Pagina: 1
Acties:

Onderwerpen


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Hallo,

Ik ben bezig met een class met allemaal input velden (text, textarea, password, enz).

Nu wil ik de mogelijkheid om rond de input velden een custom text te kunnen zetten. Ik wou dit doen d.m.v. sprintf.

Ik heb deze code uit mijn class gerukt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?
//...
    function create ($return = false) {
        $button = '';
        $name = '';
        
        if ($this->name)
            $name = ' name="'.$this->name.'"';
        
        if ($this->confirm)
            if ($this->onclick)
                $button = '<input type="'.$this->type.'"'.$name.' value="'.$this->value.'" onClick="return confirm (\''.$this->confirm.'\');'.$this->onclick.'">';
            else
                $button = '<input type="'.$this->type.'"'.$name.' value="'.$this->value.'" onClick="return confirm (\''.$this->confirm.'\')">';
        else
            if ($this->onclick)
                $button = '<input type="'.$this->type.'"'.$name.' value="'.$this->value.'" onClick="'.$this->onclick.'">';
            else
                $button = '<input type="'.$this->type.'"'.$name.' value="'.$this->value.'">';

        if ($this->field_code)
            $button = sprintf ($this->field_code, $button);
        
        if ($return)
            return $button;
        else
            echo $button;
    }
//...
?>


Met deze functie word een button gegenereerd. Wanneer $this->field_code een waarde heeft komt sprintf in actie. Maar sprintf returned niets.

$button heeft een waarde en $this->field_code ook. In $this->field_code komt %s in voor.

Wat doe ik verkeerd?

[ Voor 44% gewijzigd door Slagroom op 12-08-2004 12:09 . Reden: verduidelijken ]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Probeer eerst eens een simpel voorbeeldje met sprintf in een aparte php file. Bijvoorbeeld:
PHP:
1
echo "Test: " . sprintf("%s", "hoi") . ".";

Dan weet je of sprintf goed werkt. Als dat allemaal goed werkt, dan wordt het tijd om je code eens te gaan debuggen. Wordt sprintf wel aangeroepen, zit er echt wel een %s teken in je field_code en bevat $button echt wel een waarde. Zet ook php-warning zo hoog mogelijk.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Wanneer ik error_reporting op E_ALL zet krijg ik nog steeds geen meldingen.

Dit zijn de waarden:
code:
1
2
3
4
5
$this->field_code:
%s <a href="javascript:void (0)" onClick="window.open ('modules/language/language_edit_text_popup.php?text_id=ADMIN_PAGES_ADD_PAGE_BUTTON_ADD', 'editText', 'width=550,height=window.innerHeight')">[img]"/images/text_edit.png"[/img]</a>

$button:
<input type="submit" value="Voeg toe">


Ow ja, je voorbeeld werkt wel gewoon.

[ Voor 23% gewijzigd door Slagroom op 12-08-2004 13:38 ]


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Het blijkt dus dat er ongeldige karakters in zitten want wanneer ik $this->field_code vervang door '%s dit is een test' werkt hij wel gewoon.

Hoe kan ik nou alle ongeldige karakters omzeilen?

Ik heb dit al geprobeerd maar dit werkt ook niet:
PHP:
1
2
3
4
<?
$button = sprintf (strtr ($this->field_code, get_html_translation_table(HTML_ENTITIES)), $button);
$button = strtr ($button, array_flip (get_html_translation_table(HTML_ENTITIES)));
?>

Hiermee dacht ik alle slechte code om te zetten naar goede en weer terug.

Verwijderd

Probeer eerst eens uit te zoeken welk karakter de fout oplevert?

Een paar kandidaten zijn " ' \ en $.

Toch heb ik het idee dat dit eigenlijk niet zou moeten gebeuren... :/

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Ik heb de fout, %20 wordt ook als variabele gezien.

Maar hoe haal ik nou alle %20 achtige vermeldingen weg?

Ik ben nu bezig met preg_replace
code:
1
2
3
<?
$button = sprintf (preg_replace ('\%[0-9]{1,}', ' ', $this->field_code), $button);
?>

Dit werkt niet.

Die regexp is toch goed?

[ Voor 47% gewijzigd door Slagroom op 12-08-2004 15:07 ]


Verwijderd

Waarschijnlijk moet je gewoon de % verdubbelen (dus %% van maken).

Dat kan simpelweg met str_replace.

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
maar dan verdubbel je de %s ook en dat moet dan net weer niet...

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Ik heb het maar even zo opgelost:
PHP:
1
2
3
<?
$button = sprintf (ereg_replace ('%%s', '%s', ereg_replace ('%', '%%', $this->field_code)), $button);
?>

niet de netste methode dus wanneer jullie nog iets beter weten hou ik mij aanbevolen.

Verwijderd

Slagroom schreef op 12 augustus 2004 @ 15:29:
maar dan verdubbel je de %s ook en dat moet dan net weer niet...
Ochja, natuurlijk :|.

PHP:
1
  $safe_code = preg_replace('|%(?!s)|', '%%', $this->field_code);


Zou het moeten doen. Het vervangt alle procenten die niet gevolgd worden door een 's'.

[ Voor 7% gewijzigd door Verwijderd op 12-08-2004 16:25 ]


  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Eventueel kun je "%s" vervangen door "%1$s"

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Maar daar los je het niet mee op. IK vond die van OneOfBorg wel goed. Deze gebruik ik nu. Bedankt!

  • Ritch
  • Registratie: December 1999
  • Laatst online: 19-09 15:46
Waar bouw je die $this->field_code string op dan? kun je daar al alles een dubbele % geven behalve die %s? Dat gereplace wil je ook niet als het niet nodig is...

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
de string in field_code is variabel en er kunnen dus geen of meerdere % in zitten. Makkelijkst dus met een functie.

  • Ritch
  • Registratie: December 1999
  • Laatst online: 19-09 15:46
Ja maar die wordt toch ooit ergens gevuld? Daar zou je dat procent gedoe al af moeten vangen, dit is gewoon een hack.
Ik weet niet hoe verschillend die strings kunnen zijn, maar het voorbeeld dat je geeft heeft alleen een %s aan het begin, plak dan gewoon je string ervoor en gebruik heel sprintf niet, alleen maar overhead die je niet nodig hebt.

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Is het niet beter om gewoon van die sprintf af te zien. Je kan het ook met een simpele replace doen en een eigen tag/code:
PHP:
1
$button = str_replace("{button}", $button, "een tekst met een {button} erin");

| Toen / Nu


  • Ritch
  • Registratie: December 1999
  • Laatst online: 19-09 15:46
idd, (s)printf is gewoon de verkeerde functie voor wat je wil, doe makkelijk, KISS! :)
Pagina: 1