Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Robot do dzielenia wyrazów, Robot do dzielenia wyrazów
wcbarbi
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 5.07.2009

Ostrzeżenie: (0%)
-----


Witam, mam taki problem chciałbym stworzyć robot który dzieliłby mi wyrazy według kryterium fonetycznemu pn. za?de?cy?do?wać, u?pro?wa?dzić, na?ra?da, ku?zy?no?wie ponadto każdą oddzielną sylabę wpisywałby do następnej kolumny w wierszu tabeli np. kol./1/Lp. kol./2/zadecydować kol./3/za kol./4/de/ kol./5/cy/ kol./6/do kol./7/wać. Na dzień dzisiejszy mam stworzoną kolumnę tylko z wyrazami czyli kol./1/Lp. kol./2/zadecydować. Czy koś ma ktoś jakiś pomysł?
Powód edycji: [erix]: przeniosłem
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
SHiP
post
Post #2





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Pisałem coś podobnego kilka dni temu ale zaprzestałem (IMG:style_emoticons/default/winksmiley.jpg) . Być może mój algorytm Ci się przyda(nie jest idealny bo to wersja pre-pre-alpha) ale jeśli go zoptymalizujesz to może ładnie działać.
  1. class SoftHyphenGenerator{
  2.  
  3. public $htmlOn = false;
  4. private $samogloski = Array('a', 'ą', 'e', 'ę', 'i', 'o', 'u', 'y');
  5.  
  6. public static function mbStringToArray ($string) {
  7. $strlen = mb_strlen($string);
  8. while ($strlen) {
  9. $array[] = mb_substr($string,0,1,"UTF-8");
  10. $string = mb_substr($string,1,$strlen,"UTF-8");
  11. $strlen = mb_strlen($string);
  12. }
  13. return $array;
  14. }
  15.  
  16. private function zawieraSamogloske($string, $length, $last)
  17. {
  18. $startLength = $length;
  19. for($length--; $length>=0; $length--)
  20. {
  21. if($string[$length]=='>')
  22. $this -> htmlOn = true;
  23. elseif($string[$length]=='<')
  24. $this -> htmlOn = false;
  25. elseif($this -> htmlOn==false)
  26. {
  27. if($string[$length]=='y' || $string[$length]=='a')
  28. {
  29. if($startLength-$length==1 && in_array($last,$this -> samogloski))
  30. {
  31. return 1;
  32. }
  33. // nie jestem pewien co do tej zasady ale
  34. // nie przenosimy do nastepnej lini "ń" występującego tuż po "y"
  35. // np. młyń-skie ko-ło
  36. if($string[$length+1]=='ń')
  37. {
  38. $length++;
  39. }
  40.  
  41. return -($startLength-$length)+1;
  42.  
  43. }
  44. elseif(in_array($string[$length], $this -> samogloski))
  45. return 1;
  46. }
  47. }
  48. return 0;
  49. }
  50.  
  51.  
  52. public function addSoftHyphen($text)
  53. {
  54. $wordCounter = 0;
  55. $pieces = array_reverse(explode(' ', $text));
  56.  
  57. $returnText = Array();
  58. $this -> htmlOn = false;
  59. foreach($pieces as $piece)
  60. {
  61. $l = mb_strlen($piece,'utf-8');
  62. // pomijamy wyrazy mające mniej niz 4 litery oraz nazwy własne
  63. if($wordCounter==0 || mb_strtolower($piece,"utf-8") == $piece)
  64. {
  65. $newWord = '';
  66. // zamiana stringa na tablicę
  67. $piece = self::mbStringToArray($piece);
  68.  
  69. $samogloska = false;
  70. // sprawdzanie kolejnych znaków wyrazu - od konca
  71. for($l--; $l>=0; $l--)
  72. {
  73. if($piece[$l] == '>') $this -> htmlOn = true;
  74. elseif($piece[$l] == '<') $this -> htmlOn = false;
  75.  
  76. $newWord = $piece[$l].$newWord;
  77.  
  78. if($this -> htmlOn == false)
  79. {
  80. // jest to samogloska
  81. if(in_array(mb_strtolower($piece[$l], 'utf-8'), $this -> samogloski))
  82. {
  83. $samogloska = true;
  84. }
  85. else
  86. {
  87. if($samogloska && $l>1 && ($n = $this -> zawieraSamogloske($piece, $l, $last))!=0)
  88. {
  89. $spolgloska = true;
  90. // literki wczesniej zawierają samogloske "y"
  91. if($n<0)
  92. {
  93. while($n<0)
  94. {
  95. $l--;
  96. $newWord=$piece[$l].$newWord;
  97. $last = array_pop($piece);
  98. $n++;
  99. }
  100. $newWord = '-'.$newWord;
  101. $samogloska = false;
  102. }
  103. else
  104. {
  105. // sprawdzanie głosek 2-literowych tak aby ich nie rozdzielać
  106. switch($piece[$l])
  107. {
  108. case 'h':
  109. $stop = ( mb_strtolower($piece[$l-1])=='c');
  110. break;
  111. case 'z':
  112. $stop = ( mb_strtolower($piece[$l-1])=='c' ||
  113. mb_strtolower($piece[$l-1])=='d' ||
  114. mb_strtolower($piece[$l-1])=='r' ||
  115. mb_strtolower($piece[$l-1])=='s');
  116. break;
  117. case 'ź':
  118. $stop = ( mb_strtolower($piece[$l-1])=='d');
  119. break;
  120. case 'ż':
  121. $stop = ( mb_strtolower($piece[$l-1])=='d');
  122. break;
  123. default:
  124. $stop = ( mb_strtolower($piece[$l-1])=='g');
  125. }
  126.  
  127. if(!$stop){
  128. $newWord = '-'.$newWord;
  129. $samogloska = false;
  130. }
  131. }
  132. }
  133. }
  134. }
  135. $last = array_pop($piece);
  136. }
  137. $returnText[] = $newWord;
  138. $wordCounter++;
  139. }
  140. else
  141. $returnText[] = $piece;
  142. }
  143. return implode(' ',array_reverse($returnText));
  144. }
  145. }
  146.  
  147. $text = new SoftHyphenGenerator;
  148. echo $text -> addSoftHyphen('Jakis przykładowy tekst');


Gdybyś chciał coś porządniejszego(ale nie pamiętam jak z licencją), to poszukaj wp-typography.

Ten post edytował SHiP 25.09.2009, 11:57:48
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 00:44