[PHP] Regular Expression

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
Sinds ik in javascript een reguliere expressie heb moeten gebruiken om meerdere instances van karakters te te vervangen, ben ik er niet van gaan houden. Ik zit nu in php met een major block : weer meerdere instances vervangen. Goed ik ben voor de grap een rot13 decoder/encoder aan het maken.
heb twee mooie array's :
PHP:
1
2
$irl = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
$rot13 = array('n','o','p','q','r','s','t','u','v','w','x','y','z','a','b','c','d','e','f','g','h','i','j','k','l','m');


en ik heb een for loopje om erdoorheen te spitten
PHP:
1
2
3
4
for ($i = 0; $i != 28; $i++)
{
$hash = preg_replace("/$irl[$i]/",$rot13[$i],$hash);
}

dit is dus de encode functie, hij "encode" alle letters netjes, behalve de gene die er dubbel in voorkomen.
Met dit ben ik geeindigd. Het zal vast wel een heel makkelijk iets zijn, maar ik ben er al uren mee bezig (van die regular expressions site wordt je echt niet wijzer..ze hebben het helemaal niet over multiple instances). Ik weet dat in javascript / /g als global fungeert en dan preg_replace standaard alles hoort te replacen (ergens gelezen, maar dat klopt dus blijkbaar niet).....

Acties:
  • 0 Henk 'm!

  • DR
  • Registratie: December 2000
  • Niet online

DR

http://nl2.php.net/manual/en/function.str-rot13.php ?


of str_replace gebruiken icm die 2 arrays?

Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
str_replace wil ook niet werken. en de standaard functie wou ik nou net niet gebruiken :). Ging meer om te kijken of het me lukte...

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

str_replace werkt inderdaad niet door de manier waarop de replaces worden uitgevoerd; hiervoor zou strtr geschikter zijn:
PHP:
1
$hash = strtr($s, 'abcdefghijklmnopqrstuvwxyz', 'nopqrstuvwxyzabcdefghijklm');

als je het dan toch persé met een regular expression wilt oplossen dan ontkom je niet aan een evaluating expression of callback; iets als dit:
PHP:
1
$hash = preg_replace('/[a-z]/e', '\$rot13[array_search(\'$0\',\$irl)]', $s);

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je zal zelf door elk karakter van de string heen moeten kunnen lopen, want anders krijg je inderdaad dat je halverwege karakters gaat vervangen die je al vervangen hebt.
Als je op deze manier een associatief array bouwt:
PHP:
1
2
3
4
5
6
7
$rot13 = array(
  'a' => 'n',
  'b' => 'o',
  'c' => 'p',
  // enz...
  'z' => 'm'
);

Dan kun je het zo aanpakken:
PHP:
1
2
3
4
5
$hash = '';
for ($i = 0; $i < strlen($string); $i++) {
  $hash .= $rot13[$string[$i]];
}
echo $hash;

Je weet zo in elk geval zeker dat je niks dubbel doet. ;)
edit:
Verrek, strtr. :o

[ Voor 4% gewijzigd door NMe op 22-03-2006 00:03 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
EDIT : Laat maar, ik ga even de manier van NME proberen

[ Voor 80% gewijzigd door 3V3RT op 22-03-2006 00:10 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

3V3RT schreef op woensdag 22 maart 2006 @ 00:09:
EDIT : Laat maar, ik ga even de manier van NME proberen
Probeer liever die strtr van crisp, die is een stuk optimaler waarschijnlijk, al zal die op ongeveer dezelfde manier geïmplementeerd zijn. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

-NMe- schreef op woensdag 22 maart 2006 @ 00:15:
[...]

Probeer liever die strtr van crisp, die is een stuk optimaler waarschijnlijk, al zal die op ongeveer dezelfde manier geïmplementeerd zijn. :)
strtr maakt inderdaad een hashmap van z'n argumenten en loopt vervolgens 1x de string door zodat je geen dubbele replaces krijgt itt str_replace met array-argumenten ;)

Bij weinig argumenten en geen kans op dubbele replaces (niet in dit geval dus) is str_replace wel sneller overigens. Ik was vandaag toevallig bezig met een simpele whitespace stripper:
PHP:
1
2
3
$html = str_replace(array("\r","\n","\t"), array(), $html);
//versus
$html = strtr($html, array("\r"=>'',"\n"=>'',"\t"=>''));

de str_replace was hier een factor 8 sneller

[ Voor 33% gewijzigd door crisp op 22-03-2006 00:25 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
Goed ik weet dus nu echt niet dat wel en niet werkt (php-block ofzo). Ik zal jullie de code geven die ik nu gebruiken :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$hash = "evert";
$irl = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
$rot13 = array('n','o','p','q','r','s','t','u','v','w','x','y','z','a','b','c','d','e','f','g','h','i','j','k','l','m');



$i = 1;
while ($i < $length)
{
$hash = str_replace($irl[$i], $rot13[$i], $hash); 
$i++;
}


Dit zou toch moeten werken?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

3V3RT schreef op woensdag 22 maart 2006 @ 22:36:
Goed ik weet dus nu echt niet dat wel en niet werkt (php-block ofzo). Ik zal jullie de code geven die ik nu gebruiken :
[...]
Dit zou toch moeten werken?
Nee; kort gezegd gebeuren er uiteindelijk dit soort dingen:

PHP:
1
2
3
4
5
6
7
$hash = 'e';

...
$hash = str_replace('e', 'r');
...
$hash = str_replace('r', 'e');
...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
ik heb me while lus uitgebreid met :
PHP:
1
2
3
$hash = str_replace($irl[$i], $rot13[$i], $hash);
$irl[$i] = null;
$rot13[$i] = null;


in principe zou het dan eruit gefilterd worden?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

3V3RT schreef op woensdag 22 maart 2006 @ 23:10:
ik heb me while lus uitgebreid met :
PHP:
1
2
3
$hash = str_replace($irl[$i], $rot13[$i], $hash);
$irl[$i] = null;
$rot13[$i] = null;


in principe zou het dan eruit gefilterd worden?
Nee, en als je logisch nadenkt begrijp je ook waarom het dan nog steeds niet werkt ;)
Wat is er mis met de strtr oplossing?

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
strtr werkt perfect, alleen wou kijken of het dus ook op de manier van de array kon :).

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

3V3RT schreef op woensdag 22 maart 2006 @ 23:17:
strtr werkt perfect, alleen wou kijken of het dus ook op de manier van de array kon :).
Het kan wel met een array en een loop, alleen zul je dan bij moeten houden welke karakters je al omgezet hebt om te voorkomen dat die verder in de loop nog een keer omgezet worden :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
okay, hartstikke bedankt allemaal :)
Pagina: 1