Toon posts:

preg_replace dollar teken probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0Henk '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:
  • 0Henk 'm!

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

Blokkeert alle ads en trackers met:
- uBlock Origin
- uMatrix
- en Pi-Hole voor de rest van het netwerk.


Acties:
  • 0Henk 'm!

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

Acties:
  • 0Henk '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:
  • 0Henk 'm!

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 22-05 18:43
Moet het dollarteken niet in de $this->block al escaped worden? Dat is namelijk het subject van de replacement, waardoor deze niet gematcht wordt..

Wiethoofds meuk en 'overige'


Acties:
  • 0Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf / Backend developer

Daar is de functie preg_quote voor uitgevonden :)

Acties:
  • 0Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 26-05 14:13
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:
  • 0Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf / Backend developer

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:
  • 0Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 26-05 14:13
En het is waarschijnlijk ook efficiënter

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0Henk 'm!

  • Redsandro
  • Registratie: Januari 2007
  • Niet online
Zegt de ene regex tegen de ander:

.*

🤘 Amp.lol. No bloat, just radio. ☕ Ninite-killer. 1000+ packages. ⛟


Acties:
  • 0Henk '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:
  • 0Henk 'm!

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

{signature}


Acties:
  • 0Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf / Backend developer

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:
  • 0Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 26-05 14:13
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:
  • 0Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf / Backend developer

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:
  • 0Henk '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


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee