Как поймать Marz / März / M & auml; rz? - PullRequest
1 голос
/ 26 ноября 2010

Я пытаюсь найти месяц в тексте на немецком языке. (В html-файле)

В марте написано "März".

Я хочу быть уверен, что поймаю его, поэтому проверяю

марза, März, М & AUML; RZ

Я пытался использовать этот код

if(preg_match("/ma?ä?(ä)?rz/i", $title))
    return 3;

Отлично работает для первых двух, но не для & auml ;. Что я сделал не так?

(HTML и мои PHP-файлы закодированы в UTF8)

Ответы [ 4 ]

3 голосов
/ 26 ноября 2010

Вы должны сначала декодировать объекты, а затем использовать сравнение, которое работает с алгоритмом сопоставления Unicode .Например, это работает в Perl:

use Unicode::Collate;

my $Collator = Unicode::Collate->new(normalization => undef, level => 1);
my $str = "Ich muß Perl studieren.";
my $sub = "MÜSS";
my $match;
if (my($pos,$len) = $Collator->index($str, $sub)) {
    $match = substr($str, $pos, $len);
}

Совпадение с метками и без них возможно в соответствии с тем, что level сравнения вы хотите сделать.этого в PHP я не знаю, но я полагаю, что должна быть соответствующая библиотека, учитывая, насколько необходимы эти типы вещей.

3 голосов
/ 26 ноября 2010

Почему бы просто не попробовать

(Marz|März|März)
2 голосов
/ 26 ноября 2010

ä - это более одного байта или что-то в этом роде - вы должны сделать это:

preg_match("/ma?(ä)?(ä)?rz/i", $title);

Вы можете увидеть это здесь .

Кроме того, подход Кенга лучше.

1 голос
/ 26 ноября 2010

Если это просто для целей поиска, но , а не для возврата фактической позиции слова, вы можете нормализовать строку поиска, используя html_entity_decode() и iconv():

$string = html_entity_decode($string, ENT_QUOTES, "utf-8");
$string = iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", $string);

// then search for "Marz"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...