[PHP] eregi_replace doet het soms wel, soms niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een hele rare fout in de volgende code :

PHP:
1
$tekst = eregi_replace("\(.*?\)","",$tekst);


Ik probeer dus als er 1 of meerdere teksten tussen haakjes staan dat deze verwijderd worden (dus ook de haakjes verwijderd). In principe werkt de code goed maar als ik de pagina laadt krijg ik soms de foutmelding :

Warning : eregi_replace() [function.eregi-replace] : REG_BADRPT in /...root.../test.php on line ...

Als ik dan refresh doet ie het vaak wel maar als ik een paar keer refresh doet ie het soms wel soms niet. Ik heb het gevoel dat het iets te maken heeft met het non-greedy maken van de repetition dmv ?. Ik wil namelijk dat als er staat (blaat) woord (blaat2) dat dan het woord wel blijft staan maar de twee teksten tussen haakjes weggaan.

Heeft iemand een idee wat ik fout doe ?

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

.*? klopt dan ook niet; wat wil je daarmee bereiken? Je zegt namelijk 1 of meerdere teksten; dus dan zou het gewoon .+ moeten zijn

[ Voor 206% gewijzigd door Spider.007 op 07-10-2007 12:10 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Spider.007 schreef op zondag 07 oktober 2007 @ 12:05:
.*? klopt dan ook niet; wat wil je daarmee bereiken? Je zegt namelijk 1 of meerdere teksten; dus dan zou het gewoon .+ moeten zijn
Dan heb ik het waarschijnlijk verkeerd uitgelegd. Er kan een tekst tussen haken staan maar dat hoeft niet. Ik heb .*? gebruikt omdat vanuit de PHP handleiding begreep dat ? de manier was om de repetition non-greedy te maken

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Ja, dat klopt inderdaad; dat zag ik even over het hoofd. Kun je niet beter overstappen op preg_replace aangezien die ungreedy-ness dmv een flag ondersteund? Het lijkt erop alsof .*? niet altijd als correct wordt geaccepteerd, het is wel raar dat dat @random gebeurt. Is dit geen idee?

code:
1
\([^\)]*\)

[ Voor 18% gewijzigd door Spider.007 op 07-10-2007 12:12 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Spider.007 schreef op zondag 07 oktober 2007 @ 12:05:
.*? klopt dan ook niet; wat wil je daarmee bereiken?
Wat er niet aan klopt, klopt alleen niet in POSIX regular expressions (ereg_*). Die zijn over het algemeen ook waardeloos. De PCRE (preg_*) functies zijn stukken uitgebreider, en snappen dit dan weer wel, die maken het stuk met die quantifier ungreedy. Je hebt ook gelijk betreft die quantifier

Vervang het dus door:
PHP:
1
$tekst = preg_replace ( '~\\(.+?\\)~', '', $tekst );

Let op de dubbele backslashes. Strict gezien hier niet noodzakelijk omdat de haakjes binnen een gewone string geen bijzondere betekenis hebben, maar wel aan te raden voor de gevallen waar het teken na de backslash dat wel heeft.

[ Voor 0% gewijzigd door Verwijderd op 07-10-2007 12:16 . Reden: delimiters vergeten ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zondag 07 oktober 2007 @ 12:10:
[...]

Wat er niet aan klopt, klopt alleen niet in POSIX regular expressions (ereg_*). Die zijn over het algemeen ook waardeloos. De PCRE (preg_*) functies zijn stukken uitgebreider, en snappen dit dan weer wel, die maken het stuk met die quantifier ungreedy. Je hebt ook gelijk betreft die quantifier

Vervang het dus door:
PHP:
1
$tekst = preg_replace ( '\\(.+?\\)', '', $tekst );

Let op de dubbele backslashes. Strict gezien hier niet noodzakelijk omdat de haakjes binnen een gewone string geen bijzondere betekenis hebben, maar wel aan te raden voor de gevallen waar het teken na de backslash dat wel heeft.
Bedankt Cheatah, het werkt wel nu. Ik moest alleen nog even een / aan het begin en het einde zetten, dat moet altijd in PCRE. De code is nu :

PHP:
1
$tekst = preg_replace ( '/\(.+?\)/', '', $tekst );


Ik snap alleen niet precies wat je bedoelde met die \\. Kun je dat nog iets verduidelijken voor me?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zondag 07 oktober 2007 @ 12:16:

Ik snap alleen niet precies wat je bedoelde met die \\. Kun je dat nog iets verduidelijken voor me?
Het is het eenvoudigst te begrijpen als je alleen een backslach moet echo'en. Probeer maar eens.
PHP:
1
echo '\';

Zo moet het dus niet. Waarom zou je in een dergelijke situatie wél twee backslashes zetten, en in elke andere situatie niet? Doe het gewoon altijd, dan heb je ook niet de kans dat je een bugje introduceert door een string die anders wordt geïnterpreteerd dan jij bedoelt.

Oefeningetje:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo '<pre>';
echo 'regel 1\nregel 2';
echo '<hr>';
echo "regel 3\nregel 4";
echo '<hr>';
echo 'punt 1\punt 2';
echo '<hr>';
echo "punt 3\punt 4";
echo '<hr>';
echo 'punt 5\\punt 6';
echo '<hr>';
echo "punt 7\\punt 8";
echo '<hr>';
echo 'nog een punt 1\nog een punt 2';
echo '<hr>';
echo "nog een punt 3\nog een punt 4";
echo '<hr>';
echo 'nog een punt 5\\nog een punt 6';
echo '<hr>';
echo "nog een punt 7\\nog een punt 8";
echo '<hr>';
echo '</pre>';

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je gebruikt alleen 2 slashes als je een \ wilt escapen. Maar ik begrijp wat je bedoelt. Als je er altijd 2 zet en de laatste wordt gebruikt om een special character te escapen dan valt ie 1e op zichzelf weg en maakt het dus niet uit of je er 1 of 2 zet. Het is idd een makkelijke regel om er altijd 2 te zetten.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op zondag 07 oktober 2007 @ 13:30:
Als je er altijd 2 zet en de laatste wordt gebruikt om een special character te escapen dan valt ie 1e op zichzelf weg en maakt het dus niet uit of je er 1 of 2 zet.
Nee, dan maakt het juist wel uit. ;)
Gewoon als automatisme \\ aanleren als je een backslash wil en je zit altijd goed. :)

{signature}


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 22:41
Waarom moet je deze eigenlijk ungreedy maken?
Ik zou persoonlijk de volgende methode gebruiken:
PHP:
1
$tekst = preg_replace('#\([^\)]*\)#', '', $tekst);

Bezoek eens een willekeurige pagina

Pagina: 1