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ć.
class SoftHyphenGenerator{
public $htmlOn = false;
private $samogloski = Array('a', 'ą', 'e', 'ę', 'i', 'o', 'u', 'y');
public static function mbStringToArray
($string) { $strlen = mb_strlen($string);
while ($strlen) {
$array[] = mb_substr($string,0,1,"UTF-8");
$string = mb_substr($string,1,$strlen,"UTF-8");
$strlen = mb_strlen($string);
}
return $array;
}
private function zawieraSamogloske($string, $length, $last)
{
$startLength = $length;
for($length--; $length>=0; $length--)
{
if($string[$length]=='>')
$this -> htmlOn = true;
elseif($string[$length]=='<')
$this -> htmlOn = false;
elseif($this -> htmlOn==false)
{
if($string[$length]=='y' || $string[$length]=='a')
{
if($startLength-$length==1
&& in_array($last,$this -> samogloski)) {
return 1;
}
// nie jestem pewien co do tej zasady ale
// nie przenosimy do nastepnej lini "ń" występującego tuż po "y"
// np. młyń-skie ko-ło
if($string[$length+1]=='ń')
{
$length++;
}
return -($startLength-$length)+1;
}
elseif(in_array($string[$length], $this -> samogloski)) return 1;
}
}
return 0;
}
public function addSoftHyphen($text)
{
$wordCounter = 0;
$this -> htmlOn = false;
foreach($pieces as $piece)
{
$l = mb_strlen($piece,'utf-8');
// pomijamy wyrazy mające mniej niz 4 litery oraz nazwy własne
if($wordCounter==0 || mb_strtolower($piece,"utf-8") == $piece)
{
$newWord = '';
// zamiana stringa na tablicę
$piece = self::mbStringToArray($piece);
$samogloska = false;
// sprawdzanie kolejnych znaków wyrazu - od konca
for($l--; $l>=0; $l--)
{
if($piece[$l] == '>') $this -> htmlOn = true;
elseif($piece[$l] == '<') $this -> htmlOn = false;
$newWord = $piece[$l].$newWord;
if($this -> htmlOn == false)
{
// jest to samogloska
if(in_array(mb_strtolower
($piece[$l], 'utf-8'), $this -> samogloski)) {
$samogloska = true;
}
else
{
if($samogloska && $l>1 && ($n = $this -> zawieraSamogloske($piece, $l, $last))!=0)
{
$spolgloska = true;
// literki wczesniej zawierają samogloske "y"
if($n<0)
{
while($n<0)
{
$l--;
$newWord=$piece[$l].$newWord;
$n++;
}
$newWord = '-'.$newWord;
$samogloska = false;
}
else
{
// sprawdzanie głosek 2-literowych tak aby ich nie rozdzielać
switch($piece[$l])
{
case 'h':
$stop = ( mb_strtolower($piece[$l-1])=='c');
break;
case 'z':
$stop = ( mb_strtolower($piece[$l-1])=='c' ||
mb_strtolower($piece[$l-1])=='d' ||
mb_strtolower($piece[$l-1])=='r' ||
mb_strtolower($piece[$l-1])=='s');
break;
case 'ź':
$stop = ( mb_strtolower($piece[$l-1])=='d');
break;
case 'ż':
$stop = ( mb_strtolower($piece[$l-1])=='d');
break;
default:
$stop = ( mb_strtolower($piece[$l-1])=='g');
}
if(!$stop){
$newWord = '-'.$newWord;
$samogloska = false;
}
}
}
}
}
}
$returnText[] = $newWord;
$wordCounter++;
}
else
$returnText[] = $piece;
}
}
}
$text = new SoftHyphenGenerator;
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