[PHP] 2 letters omzetten naar 1...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ellow,

Een paar dagen geleden was ik een topic begonnen met een vraag over een functie die (Nederlandse) woorden om moet zetten in afbeeldingen die dan gebaren uit de (Nederlandse) gebarentaal voorstellen. Daar had ik het probleem dat, als het woord niet als afbeelding bestaat, het woord 'gevingerspeld' moet worden. Ik moest dus onbekende woorden letter-voor-letter bekijken en dan die letters steeds omzetten in een andere afbeelding. Dát deel is opgelosd.
Alleen is er een nieuw probleem opgedoken. Als er twee of meer dezelfde letters door elkaar worden opgevolgd, komt er bijvoorbeeld niet "AAA" te staan, maar wordt het gebaar "A" naar buiten bewogen. (je zwaait bijna) Hier heb je natuurlijk ook afbeeldingen voor, máár hoe zeg je tegen PHP dat hij, als 2 of meer dezelfde letters achter elkaar staan, ze moet vervangen?
Ik had bedacht dat het misschien wel handig zou zijn om de 'dubbele-letter-afbeeldingen' dan namen te geven zoals A.png, B.png, enz... en de 'enkele-letter-afbeeldingen' namen zoals a.png, b.png, enz..
edit:
|:( Ik kom vast heel dom over, maar kom er net achter dat A.png volgens Windows 'tzelfde is als a.png... kan deze twee niet in dezelfde map opslaan... nieuw probleem er dus bij. M'n webserver ziet wél verschil tussen A.png en a.png...

De code die ik tot nu toe heb, is:
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
function gebaar($string){
/* het woord moet in kleine letters worden geplaatst, anders wordt het niet herkend */
 $string = strtolower($string);
/* leestekens worden hier al eruit gefilterd, dit gebeurt zolang ik niet weet wat de afbeeldingen voor leestekens zijn 0=) */
 $string = str_replace(",", "", $string);
/* de woorden worden van elkaar gescheiden in arrays, zo zijn ze beter te behandelen */
 $string = split(" ", $string);
/* nu worden de woorden vergeleken met de namen van de afbeeldingen in de database, als ze gelijk zijn, wordt het woord door de afbeelding vervangen */
 for($i = 0; $i < count($string); $i++){
  $path = "img/sw/".$string[$i].".png";
  if(file_exists($path)){
/* het woord komt overeen met de naam van een afbeelding en wordt door deze afbeelding vervangen */
   $size = getimagesize($path);
   echo "[img]\"".$path."\"[/img] ";
  } else {
/* het woord staat nog niet in de database van afbeeldingen, het moet gespeld worden */
   echo "<span style=\"unknown-sign\" title=\"".strtoupper($string[$i])."\">";
/* speciale tekens omzetten */
   $string[$i] = str_replace("ij", "y", $string[$i]);
   $vervang = "áäàãâçéëèêíïìîóöòõôúüùûÿ";
   $door = "aaaaaceeeeiiiiooooouuuuy";
   for($j = 0; $j < strlen($vervang); $j++){
    $string[$i] = str_replace($vervang{$j}, $door{$j}, $string[$i]);
   }
/* letter-naar-plaatje */
   for($j = 0; $j < strlen($string[$i]); $j++){
    $path = "img/sw/alfabet/".$string[$i]{$j}.".png";
    if(file_exists($path)){
     $size = getimagesize($path);
    }
    $string2{$j} = str_replace($string[$i]{$j}, "[img]\"".$path."\"[/img]", $string[$i]{$j});
    echo $string2{$j};
   }
   echo "</span>";
  }
 }
}


Alvast bedankt voor de hulp _/-\o_

[ Voor 13% gewijzigd door Verwijderd op 11-12-2004 21:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

windows ziet in tegenstelling tot linux geen verschil tussen hoofdletters en kleine letters. daarom kun je ze niet in de zelfde map opslaan (ze hebben immers de zelfde naam volgens windows).

Je zou de woorden letter voor letter door kunnen lopen en kijken of geselecteerde letter het zelfde is als de volgende letter en hierna 1 van de letter verwijderen. of je vervangt alle dubbele letters voor een enkele (dus allemaal str_replace()). Optie 1 lijkt mij het beste

Acties:
  • 0 Henk 'm!

  • creative8500
  • Registratie: September 2001
  • Laatst online: 01-02 14:14

creative8500

freedom.

Wat betreft die bestandsnamen: in de meeste (zoniet alle) gangbare filesystems voor GNU/Linux zijn case sensitive. FAT32 en NTFS daarentegen zijn case insensitive.

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Regular expresssions, iets als preg_replace(';(.*)+;U', '$1', $input);
of bijhouden wat je vorige teken is, zijn ze hetzelfde dan skip je de loop. Dan kun je ook nog bijhouden hoe vaak je de de tekens tegenkomt.

Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

Misschien kun je iets als dit gebruiken:


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
/* letter-naar-plaatje */
   for($j = 0; $j < strlen($string[$i]); $j++)
   {
    $counter = 1;
    while($j < strlen($string[$i]) - 1 
        && $string[$i]{$j} == $string[$i]{($j + 1)})
    {
        $j++;
        $counter++;
    }
   
    $path = "img/sw/alfabet/".$string[$i]{$j}.".png";
    if($counter > 1)
    {
     /* if 'aaa' -> 'a+' */
     $path = "img/sw/alfabet/".$string[$i]{$j}."+.png";
    }
    
    if(file_exists($path))
    {
     $size = getimagesize($path);
    }     
    echo "[img]\"".$path."\"[/img]";
   }

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 11 december 2004 @ 21:10:
windows ziet in tegenstelling tot linux geen verschil tussen hoofdletters en kleine letters. daarom kun je ze niet in de zelfde map opslaan (ze hebben immers de zelfde naam volgens windows).
daar kwam ik dus (te laat) achter.. alsnog bedankt!
Je zou de woorden letter voor letter door kunnen lopen en kijken of geselecteerde letter het zelfde is als de volgende letter en hierna 1 van de letter verwijderen. of je vervangt alle dubbele letters voor een enkele (dus allemaal str_replace()). Optie 1 lijkt mij het beste
ik heb gekozen voor te werken met str_replace()..
creative8500 schreef op zaterdag 11 december 2004 @ 21:11:
Wat betreft die bestandsnamen: in de meeste (zoniet alle) gangbare filesystems voor GNU/Linux zijn case sensitive. FAT32 en NTFS daarentegen zijn case insensitive.
aahk.. dus eigluk heb ik 'n Linux-achtig besturingssysteem nodig om de bestanden een handige naam te geven? :9 ik ga nu de bestanden maar met hele rare namen opslaan (á is aa, ä is bb, à is cc, enz.. zit echt geen logica meer in :P)
PrisonerOfPain schreef op zaterdag 11 december 2004 @ 21:59:
Regular expresssions, iets als preg_replace(';(.*)+;U', '$1', $input);
of bijhouden wat je vorige teken is, zijn ze hetzelfde dan skip je de loop. Dan kun je ook nog bijhouden hoe vaak je de de tekens tegenkomt.
eehm.. die regexp begrijp ik voor geen meter =$ ik heb wel *ooit* iets over regexp gelezen, maar heb 't ook niet echt goed opgeslagen in m'n hoofd...
BHR schreef op zaterdag 11 december 2004 @ 22:24:
Misschien kun je iets als dit gebruiken:


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
/* letter-naar-plaatje */
   for($j = 0; $j < strlen($string[$i]); $j++)
   {
    $counter = 1;
    while($j < strlen($string[$i]) - 1 
        && $string[$i]{$j} == $string[$i]{($j + 1)})
    {
        $j++;
        $counter++;
    }
   
    $path = "img/sw/alfabet/".$string[$i]{$j}.".png";
    if($counter > 1)
    {
     /* if 'aaa' -> 'a+' */
     $path = "img/sw/alfabet/".$string[$i]{$j}."+.png";
    }
    
    if(file_exists($path))
    {
     $size = getimagesize($path);
    }     
    echo "[img]\"".$path."\"[/img]";
   }
bedankt voor 't antwoord! was net bezig met reply-en en had 't antwoord net gevonden :) (gebeurt echt nooit, ik en 'n antwoord op m'n eigen vraag vinden.. =$)
't nieuwe deel van m'n code is:
PHP:
1
2
3
4
5
6
7
8
9
$dubbel['vervang'] = "abcdefghijklmnopqrstuvwxyz";
$dubbel['door'] = "áäàãâçéëèêíïìîóöòõôúüùûÿýþ";
for($k = 0; $k < strlen($string[$i]); $k++){
 for($l = 0; $l < strlen($dubbel['vervang']); $l++){
  $string[$i] = str_replace($dubbel['vervang']{$l}.$dubbel['vervang']{$l}, $dubbel['door']{$l}, $string[$i]);
  $string[$i] = str_replace($dubbel['door']{$l}.$dubbel['vervang']{$l}, $dubbel['door']{$l}, $string[$i]);
  $string[$i] = str_replace($dubbel['door']{$l}.$dubbel['door']{$l}, $dubbel['door']{$l}, $string[$i]);
 }
}

Zoals je ziet, er zit écht geen logica meer in de bestandsnamen van de afbeeldingen, maar tja... ben trots dat ik voor 't eerst 't antwoord op m'n eigen vraag heb gevonden! (met hulp... O-) )
Iedereen weer bedankt!! _/-\o_

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BHR, heb nog ff zitten nadenken over jouw stukje.. heb er iets mee gedaan! =D
De bestanden hebben nu logischere namen, (aa heet a+, bb heet b+, enz..)
heb 't met dit stukje code gedaan:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* letter-naar-plaatje */
for($j = 0; $j < strlen($string[$i]); $j++){
 if(htmlentities($string[$i]{$j}) == $string[$i]{$j}){
  $path = "img/sw/alfabet/".$string[$i]{$j}.".png";
 } else {
  for($k = 0; $k < strlen($dubbel['vervang']); $k++){
   $string[$i]{$j} = str_replace($dubbel['door']{$k}, $dubbel['vervang']{$k}, $string[$i]{$j});
  }
  $path = "img/sw/alfabet/".$string[$i]{$j}."+.png";
 }
 if(file_exists($path)){
  $size = getimagesize($path);
 }
 $string2{$j} = str_replace($string[$i]{$j}, "[img]\"".$path."\"[/img]", $string[$i]{$j});
 echo $string2{$j};
}


Nogmaals, iedereen bedankt! _/-\o_

Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 19:46
Even een losse opmerking, alhoewel je het wel anders hebt opgelost:
code:
1
2
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel]
"obcaseinsensitive"=dword:00000000


maakt ook ntfs case-sensitive.

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
$input = 'twee letters omzetten naar een';
$replaced = preg_replace ( '/([a-z])\\1+/', '\\1+', $input );
$signs = preg_split ( '/([a-z]\+?)/', $replaced, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
print_r ( $signs );

Als je regular expressions kunt "lezen", zie je dat de code zelf vaak veel eenvoudiger wordt. Je moet je alleen gaan bedenken dat je wel even een flinke library gaat gebruiken met regular expressions. :)
Pagina: 1