str_replace удалить любой символ не в массиве

Здравствуйте, у меня есть эта функция для замены греческих символов на латинские.

function greeklish($Name) 
{  
$greek   = array('α','ά','Ά','Α','β','Β','γ', 'Γ', 'δ','Δ','ε','έ','Ε','Έ','ζ','Ζ','η','ή','Η','θ','Θ','ι','ί','ϊ','ΐ','Ι','Ί', 'κ','Κ','λ','Λ','μ','Μ','ν','Ν','ξ','Ξ','ο','ό','Ο','Ό','π','Π','ρ','Ρ','σ','ς', 'Σ','τ','Τ','υ','ύ','Υ','Ύ','φ','Φ','χ','Χ','ψ','Ψ','ω','ώ','Ω','Ώ',' ',"'","'",','); 
$english = array('a', 'a','A','A','b','B','g','G','d','D','e','e','E','E','z','Z','i','i','I','th','Th', 'i','i','i','i','I','I','k','K','l','L','m','M','n','N','x','X','o','o','O','O','p','P' ,'r','R','s','s','S','t','T','u','u','Y','Y','f','F','ch','Ch','ps','Ps','o','o','O','O','_','_','_','_'); 
$string  = str_replace($greek, $english, $Name); 
return $string; 
} 
echo greeklish("Το ελληνικό κείμενο εδώ");

и мне было интересно, есть ли быстрый способ изменить эту функцию, чтобы заменить/удалить любой символ, найденный в $Name, который не находится в массиве $greek с ''

ОБНОВЛЕНИЕ

Я забыл упомянуть, что в Греции есть способ набора текста, который в основном используется людьми младшего возраста, когда они печатают греческие слова латинскими буквами. Также нет чего-то стандартного например:

'ει' 'υ' 'ι' 'οι' 'η' звучит как 'e'

'θ' можно записать как 'th' или '8' или даже '3'

поэтому для этого преобразования необходим специальный алгоритм.


person syd619    schedule 26.03.2014    source источник
comment
iconv — это набор функций для преобразования строки из одной сортировки /кодирование в другое. У него есть опция транслитерации, которая заменяет символ из сопоставления эквивалентным символом из другого сопоставления.   -  person Mihai Stancu    schedule 26.03.2014
comment
@GolezTrol есть опция транслита, как описано в руководстве. Если вы добавите строку // TRANSLIT к out_charset, транслитерация активируется. Это означает, что когда символ не может быть представлен в целевой кодировке, он может быть аппроксимирован одним или несколькими похожими символами. Если вы добавляете строку //IGNORE, символы, которые не могут быть представлены в целевом наборе символов, автоматически отбрасываются. В противном случае str удаляется из первого недопустимого символа и генерируется E_NOTICE.   -  person Mihai Stancu    schedule 26.03.2014
comment
@Mihai На самом деле не выполняет свою работу: 3v4l.org/jkq3A. Не уверен, что iconv может сделать то же самое сопоставление.   -  person deceze♦    schedule 26.03.2014
comment
@deceze Я помню, как работал с ним для немецкого и французского языков - тоже были такие странные проблемы с ним, потребовалось много проб и ошибок, чтобы заставить его работать, включая различные попытки setlocale, но в конце концов это сработало (для большая часть).   -  person Mihai Stancu    schedule 26.03.2014
comment
@deceze это правда, что в немецком и французском языках транслитерируемые символы не были обычными символами, сопоставленными с одной и той же точкой символа в ASCII, они были диакритическими символами соответствующих языков.   -  person Mihai Stancu    schedule 26.03.2014
comment
@Mihai Да, сопоставить ä с a довольно просто. Однако β к b довольно произвольно, не знаю, указано ли где-либо официально это отношение.   -  person deceze♦    schedule 26.03.2014
comment
@deceze Я попробовал немного кода, чтобы получить mb_ord/mb_chr каждого символа в тексте и вычесть разницу между a и α. Я хотел проверить, не смещены ли алфавиты (случайно) на фиксированное значение. Но это не так :-).   -  person Mihai Stancu    schedule 26.03.2014


Ответы (3)


Я бы предложил это:

$regex  = sprintf('/[^%s]/u', preg_quote(join($greek), '/'));
$string = preg_replace($regex, '', $string);
person deceze♦    schedule 26.03.2014

Вы можете использовать его в качестве параметра:

function greeklish($Name, $invert=false) 
{  
   $greek   = array('α','ά','Ά','Α','β','Β','γ', 'Γ', 'δ','Δ','ε','έ','Ε','Έ','ζ','Ζ','η','ή','Η','θ','Θ','ι','ί','ϊ','ΐ','Ι','Ί', 'κ','Κ','λ','Λ','μ','Μ','ν','Ν','ξ','Ξ','ο','ό','Ο','Ό','π','Π','ρ','Ρ','σ','ς', 'Σ','τ','Τ','υ','ύ','Υ','Ύ','φ','Φ','χ','Χ','ψ','Ψ','ω','ώ','Ω','Ώ',' ',"'","'",','); 
   if($invert)
   {
      return preg_replace('/[^'.preg_quote(join('', $greek), '/').']/', '', $Name);
   }
   $english = array('a', 'a','A','A','b','B','g','G','d','D','e','e','E','E','z','Z','i','i','I','th','Th', 'i','i','i','i','I','I','k','K','l','L','m','M','n','N','x','X','o','o','O','O','p','P' ,'r','R','s','s','S','t','T','u','u','Y','Y','f','F','ch','Ch','ps','Ps','o','o','O','O','_','_','_','_'); 
   $string  = str_replace($greek, $english, $Name); 
   return $string; 
} 

echo greeklish("Το ελληνικό κείμενο εδώ", 1);
person Alma Do    schedule 26.03.2014

Это может помочь вам:

$string = preg_replace("/[^\p{Greek}]+/u", '', $string);

, или как упомянул HamZa:

$string = preg_replace("/\P{Greek}+/u", '', $string);
person blue    schedule 26.03.2014
comment
Вы можете использовать /\P{Greek}/u - person HamZa; 26.03.2014