Zrobiłem wyszukiwarkę słów w bazie danych. Wykorzystuję FULL TEXT SEARCH w trybie BOOLEAN.
Szukam rozwiązania aby przykładowo ze słowa "wąż" kodowanego w UNICODE pozyskać wszystkie inne kombinacje tego wyrazu napisane częściowo tylko znakami ASCII. Te kombinacje są następujące: waz
, wąz
, waż
. Tak samo dla słowa żółw
, są kombinacje : zółw
, zołw
, zolw
, zólw
, żólw
. Chciałbym aby to rozwiązanie było uniwersalne i działało też dla rumuńskiego słowa giga
- gîgă
, or hiszpańskiego słowa ołówek - lápiz
.
Napisałem prostą procedurę, która rozbija dwa wyrazy "żółw wąż" na dwie tablice liter. Dodatkowo wykrywa czy znak jest ASCII pomiędzy wartościami 0 - 127. Na koniec składam te wyrazy z poszczególnych liter. Jak zmienić litery ze znakami diakrytycznymi na litery bez tych znaków?
Dobrze, aby to działało nie tylko dla języka polskiego.
<?php
$string = "żółw wąż";
$words = explode(' ', $string);
$number=count($words);
$regex = '/[^a-zA-Z]/';
//$regex = '/[^\x20-\x7e]/'; // to też się sprawdza
for ($i=0;$i<$number;$i++)
{
if (!preg_match($regex,$words[$i])) // wykryj słowa ze znakami ASCII
{
// OK dla słów z a-zA-Z
// Ale nic nie rób!
//$clean[$i] = iconv('UTF-8', 'US-ASCII//TRANSLIT', $words[$i]);
//echo " +" . $clean[$i] . " - $i, ";
}
else
{
$chars_oryginal[$i] = mb_str_split($words[$i]);
$length = count($chars_oryginal[$i]);
for ($j=0;$j<$length;$j++)
{
if (!preg_match($regex,$chars_oryginal[$i][$j])) // wykryj znak czy a-zA-Z
{
$char_unicode_value = mb_ord($chars_oryginal[$i][$j]); // Wartość integer znaku UNICODE
echo " + " . $char_unicode_value . " = " . $chars_oryginal[$i][$j] . " - $j, ";
}
else // tu wykrywa znak diakrytyczny dowolnego języka z alfabetu latin
{
$char_unicode_value = mb_ord($chars_oryginal[$i][$j]); // Wartość integer znaku UNICODE
echo " - $j) " . $char_unicode_value . " = " . $chars_oryginal[$i][$j] . ", " ; // wyświetl wartość i znak
..... TUTAJ BRAKUJE MI POMYSŁU
// Podmień Ą na A lub Ę na E lub ż na z lub ą na a
// Zapisz cały wyraz "żółw" lub "wąż"z podmienioną literą do tablicy
.....
}
}
}
}
/// skladanie wyrazów
for ($i=0;$i<$number;$i++)
{
$new_word[$i] = implode("", $chars_oryginal[$i]);
echo " " . $i . ") - " . $new_word[$i];
}
?>
Wynikiem tego kodu jest:
- 0) 380 = ż, - 1) 243 = ó, - 2) 322 = ł, + 3) 119 = w, + 4) 105 = i, + 5) 97 = a, + 0) 119 = w, - 1) 261 = ą, - 2) 380 = ż, 0) - żółwia 1) - wąż
Znaki diakrytyczne są poprzedzone znakiem minus, a bez ogonków znakiem plus.
Może da się wykorzystać to, że można wyciągnąć wartości integer znaków UNICODE poszczególnych wyrazów.
Macie jakieś pomysły?