preg_replace á, é enz.
Ik ben niet zo'n kei met reguliere expressies, maar ik wil dus als er een letter met een acute grave of trema in een woord voorkomt dit vervangen daar de 'gewone letter. Dus bv café wordt cafe, en máár wordt maar. Kan dit in één preg_replace voor alle letters?
Nee, dat is nog omslachtiger,
Maar ik denk dat ik de oplossing al heb. laat het zo weten :-)
Maar ik denk dat ik de oplossing al heb. laat het zo weten :-)
Ik zou er eerder strtr voor gebruiken:
PS: Ik weet niet welke methode sneller is, zou je even moeten testen met PHPbench (beetje reclame maken :D)
Code (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
31
32
33
34
35
36
37
38
39
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
31
32
33
34
35
36
37
38
39
<?php
$str = 'Çàfétârïá';
$characters = Array(
'Ç' => 'C',
'ç' => 'c',
'À' => 'A',
'à' => 'a',
'Á' => 'A',
'á' => 'a',
'Ä' => 'A',
'ä' => 'a',
'Â' => 'A',
'â' => 'a',
'È' => 'E',
'è' => 'e',
'É' => 'E',
'é' => 'e',
'Ë' => 'E',
'ë' => 'e',
'Ê' => 'E',
'ê' => 'e',
'Ì' => 'I',
'ì' => 'i',
'Í' => 'I',
'í' => 'i',
'Ï' => 'I',
'ï' => 'i',
'Î' => 'I',
'î' => 'i',
);
$str = strtr($str, $characters);
echo $str;
?>
$str = 'Çàfétârïá';
$characters = Array(
'Ç' => 'C',
'ç' => 'c',
'À' => 'A',
'à' => 'a',
'Á' => 'A',
'á' => 'a',
'Ä' => 'A',
'ä' => 'a',
'Â' => 'A',
'â' => 'a',
'È' => 'E',
'è' => 'e',
'É' => 'E',
'é' => 'e',
'Ë' => 'E',
'ë' => 'e',
'Ê' => 'E',
'ê' => 'e',
'Ì' => 'I',
'ì' => 'i',
'Í' => 'I',
'í' => 'i',
'Ï' => 'I',
'ï' => 'i',
'Î' => 'I',
'î' => 'i',
);
$str = strtr($str, $characters);
echo $str;
?>
PS: Ik weet niet welke methode sneller is, zou je even moeten testen met PHPbench (beetje reclame maken :D)
Edit:
Ben benieuwd...
Gewijzigd op 29/02/2012 15:13:26 door Wouter J
Dit was mijn oplossing:
Output:
7.4999999999992E-5
cafetaria in udenhout
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$patterns = array('/(á)|(à)|(ä)/', '/(é)|(è)|(ë)/', '/ç/', '/(í)|(ì)|(ï)/', '/(ó)|(ò)|(ö)/', '/(ú)|(ù)|(ü)/');
$replacements = array('a', 'e', 'c', 'i', 'o', 'u');
$starttime = microtime();
$test = 'çáfétàríä ïn üdënhòút';
$test = preg_replace($patterns, $replacements, $test);
echo microtime() - $starttime;
echo '<br>' . $test;
?>
$patterns = array('/(á)|(à)|(ä)/', '/(é)|(è)|(ë)/', '/ç/', '/(í)|(ì)|(ï)/', '/(ó)|(ò)|(ö)/', '/(ú)|(ù)|(ü)/');
$replacements = array('a', 'e', 'c', 'i', 'o', 'u');
$starttime = microtime();
$test = 'çáfétàríä ïn üdënhòút';
$test = preg_replace($patterns, $replacements, $test);
echo microtime() - $starttime;
echo '<br>' . $test;
?>
Output:
7.4999999999992E-5
cafetaria in udenhout
Even wat verbeteringen aangepast, het werkt nu ook met hoofdletters en iets betere regexen:
Dank je Wouter ;-)
Als ik mag raten: +100, lol
Als ik mag raten: +100, lol
Wouter, /i werkt niet op ä etc. Dus ik heb even een workaround gemaakt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$cats = array(array('dutchwords.txt', 'Nederlandse taal'), array('germanwords.txt', 'Duitse taal'), array('_artist.txt', 'Muziek'));
$patterns = array('/Á|À|Ä|Â|Ã/', '/É|È|Ë|Ê/', '/Ç/', '/Í|Ì|Ï|Î/', '/Ó|Ò|Ö|Ô|Õ/', '/Ú|Ù|Ü|Û/', '/ß/');
$replacements = array('A', 'E', 'C', 'I', 'O', 'U', 'SS');
$randcat = rand(0, 2);
$words = file($cats[$randcat][0]);
$random = rand(0, count($words)-1);
$orgWord = mb_convert_encoding(mb_strtoupper(trim($words[$random]), 'ISO-8859-1'), 'UTF-8', 'ISO-8859-1');
$comWord = preg_replace($patterns, $replacements, $orgWord);
echo ("orgWord=" . $orgWord . "&comWord=" . $comWord . "&cat=" . urlencode($cats[$randcat][1]));
?>
$cats = array(array('dutchwords.txt', 'Nederlandse taal'), array('germanwords.txt', 'Duitse taal'), array('_artist.txt', 'Muziek'));
$patterns = array('/Á|À|Ä|Â|Ã/', '/É|È|Ë|Ê/', '/Ç/', '/Í|Ì|Ï|Î/', '/Ó|Ò|Ö|Ô|Õ/', '/Ú|Ù|Ü|Û/', '/ß/');
$replacements = array('A', 'E', 'C', 'I', 'O', 'U', 'SS');
$randcat = rand(0, 2);
$words = file($cats[$randcat][0]);
$random = rand(0, count($words)-1);
$orgWord = mb_convert_encoding(mb_strtoupper(trim($words[$random]), 'ISO-8859-1'), 'UTF-8', 'ISO-8859-1');
$comWord = preg_replace($patterns, $replacements, $orgWord);
echo ("orgWord=" . $orgWord . "&comWord=" . $comWord . "&cat=" . urlencode($cats[$randcat][1]));
?>
Of je stopt ze beiden in dezelfde array, dat scheelt weer van dat gecodeer.
Jacco, het converten van de encoding is nodig omdat anders de preg_replace niet goed werkt.
Ger heeft gelijk, je moet zorgen dat je 1 encodering gebruikt input en output. Dan kun je alles over 1 kam scheren wat normaliter niet netjes is , maar in deze gevallen extreem handig.
Zorg dat je altijd met dezelfde encodering werkt (bijv. UTF-8) dan kun je ook makkelijker ASCII tabellen raadplegen en zoeken op hex waardes (daar zijn die tabellen erg handig in)
Dat scheelt enorm qua uitzoek werk.
Zorg dat je altijd met dezelfde encodering werkt (bijv. UTF-8) dan kun je ook makkelijker ASCII tabellen raadplegen en zoeken op hex waardes (daar zijn die tabellen erg handig in)
Dat scheelt enorm qua uitzoek werk.




