preg_replace dollar teken probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 152426

Topicstarter
Hi mensen,

Als ik een stukje tekst met een dollarteken, gevolgd door een integer, ( $9) door de preg_replace gooi wordt die $9 niet getoond.

Bijv. : " Ik heb $9 te besteden" -> " Ik heb te besteden"

Originele preg_replace :
PHP:
1
    $block = preg_replace ( "#\{" . $pattern . "\}#si", $replacement, $this->block);


Preg_rplace ziet de $9 als een callback..

Na gegoogled te hebben kom ik tot het toevoegen van een strtr :

PHP:
1
    $this->block = preg_replace ( "#\{" . $pattern . "\}#si", strtr($replacement, array('$' => '\$')), $this->block );


Dit geeft echter nog steeds hetzelfde resultaat.

Kan iemand mij op weg helpen?

Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Misschien handig je $pattern en andere relevante strings even te noemen ;)

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
de waarde van $pattern in enkele quotes zetten of het dollar teken escapen.

Acties:
  • 0 Henk 'm!

Anoniem: 26306

Room42 schreef op zondag 22 mei 2011 @ 23:26:
Misschien handig je $pattern en andere relevante strings even te noemen ;)
Als hij die had bekeken had hij de vraag niet hoeven stellen.

Acties:
  • 0 Henk 'm!

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 05-04 21:23

Wiethoofd

Broadcast TOM

Moet het dollarteken niet in de $this->block al escaped worden? Dat is namelijk het subject van de replacement, waardoor deze niet gematcht wordt..

Volg me op Twitter/X & Bluesky


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Daar is de functie preg_quote voor uitgevonden :)

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11:02
http://php.net/manual/en/function.preg-quote.php

edit: :@ net te laat

En jouw strtr oplossing had gewerkt als je '\\$' had gebruikt (dubbele backslash), maar preg_quote is vollediger.

[ Voor 67% gewijzigd door Gamebuster op 22-05-2011 23:34 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Gamebuster schreef op zondag 22 mei 2011 @ 23:32:
http://php.net/manual/en/function.preg-quote.php

edit: :@ net te laat

En jouw strtr oplossing had gewerkt als je '\\$' had gebruikt (dubbele backslash), maar preg_quote is vollediger.
Niet alleen vollediger, maar geeft ook duidelijkere code.

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11:02
En het is waarschijnlijk ook efficiënter

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Zegt de ene regex tegen de ander:

.*

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

Anoniem: 152426

Topicstarter
Hi mensen,

thanks voor de hulp.

Nadeel van preg_quote is dat alle volgende karakters worden ge-escaped : . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
Dat is niet wenselijk. Voor zover ik kan lezen is het niet mogelijk om enkel de $ te preg_quoten toch?

Wat betreft de andere oplossing die jullie aandragen... ik heb de preg_replace aangepast zoals jullie aangeven. Dit geeft echter geen wijziging, $9 wordt nog steeds niet getoond.
Heb ik jullie tips fout verwerkt?

PHP:
1
$this->block = preg_replace ( '#\{' . $pattern . '\}#si', strtr($replacement, array('$' => '\\$')), $this->block );

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Laat $pattern nou eens zien...

{signature}


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Anoniem: 152426 schreef op maandag 23 mei 2011 @ 10:37:
Nadeel van preg_quote is dat alle volgende karakters worden ge-escaped : . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
Dat is niet wenselijk. Voor zover ik kan lezen is het niet mogelijk om enkel de $ te preg_quoten toch?
Het is niet wenselijk om je data te escapen? Regel 1: vertrouw nooit de input!

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11:02
Erkens schreef op maandag 23 mei 2011 @ 11:06:
[...]

Het is niet wenselijk om je data te escapen? Regel 1: vertrouw nooit de input!
Ik snap al wat-ie bedoeld. Hij wilt hier de replacement-string escapen, niet een fragment van de regular expression. preg_quote is daar niet voor bedoeld.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Gamebuster schreef op dinsdag 24 mei 2011 @ 14:44:
[...]

Ik snap al wat-ie bedoeld. Hij wilt hier de replacement-string escapen, niet een fragment van de regular expression. preg_quote is daar niet voor bedoeld.
Ah, nu zie ik het ook.
Nu is daar onlangs op php.net een mooie user-note geplaatst die dat fixed:
If there's a chance your replacement text contains any strings such as "$0.95", you'll need to escape those $n backreferences:

PHP:
1
2
3
4
function escape_backreference($x)
{
    return preg_replace('/\$(\d)/', '\\\$$1', $x);
}

Acties:
  • 0 Henk 'm!

Anoniem: 152426

Topicstarter
Thanks mensen _/-\o_ ,

ik heb 't als volgt opgelost:

PHP:
1
$this->block = preg_replace ( '#\{' . $pattern . '\}#si', preg_replace('/\$(\d)/', '\\\$$1', $replacement),  $this->block );


Dat werkt!

p.s. 'pattern' is in deze een rare term aangezien $pattern niet meer is dan 'content', 'title' o.i.d.

[ Voor 19% gewijzigd door Anoniem: 152426 op 24-05-2011 21:18 ]

Pagina: 1