Если взять бумажку и выписать все это "не сосчитать", оно окажется меньше этого вопроса.
С учетом того, что заглавные и строчные все равно нужно различать - про preg_replace можно просто забыть.
Придется таки сесть и написать полную табличку замены - примерно в один экран размером.
Adamos, Вы судите объем по примеру? В моем случае все это "не сосчитать" займет как минимум несколько миллионов строк.
Одно правило с буквой "J" + каждой гласной (и да, по-отдельности их нельзя было заменить) заняло 110 строк.
Правило из 5 букв займет около 10 000 строк. Представьте, что таких правил 1 000.
А теперь представьте 10 000 правил, на регистры каждого из которых по 10 000 строк.
Forman, если у вас каждый вариант умножается на дополнительные варианты - очевидно, имеет смысл делать предобработку строк перед этими правилами. Добиться от регулярок, чтобы они были выборочно регистрозависимыми, все равно невозможно.
Forman, Судя по вашему примеру, регистр заменяющего символа определяется первым символом вхождения, что мешает сделать замену сначала для верхнего регистра, вроде такого /([A-Z][A-z]{1,2})/gm, а следом для нижнего регистра? Вы так же можете генерировать динамическую регулярку прямо в цикле обхода. сгенерировать список кандидатов на замену с предложенным вариантом для премодерации. Можно даже сделать интерактивную замену для спорных случаев.
Mazino, неудачный пример, т.к. одна буква использовалась.
Задача выглядит так, чтобы это работало с символами внутри слова.
'deRe' => 'деРе' (при этом нельзя решить это через односимвольную автозамену, поскольку r = ръ, de = дэ и т.д.)
"Вы так же можете генерировать динамическую регулярку прямо в цикле обхода. сгенерировать список кандидатов на замену с предложенным вариантом для премодерации. Можно даже сделать интерактивную замену для спорных случаев." - можно поподробнее, как это сделать?)
Вам, похоже, нужно просто отказаться от стандартных функций и собрать собственный конечный автомат.
1. Берется первый символ
2. Рассматриваются варианты: если с него есть сочетания, он запоминается, если нет - переводится.
3. Берется следующий символ
4. Если есть запомненный, анализируется, возможно ли такое сочетание
5. Если да, то на выход идет транслит этого сочетания, регистр которого зависит от первого символа (либо, если есть более сложные, оно запоминается и возвращаемся к п. 3)
6. Если нет - на выход идет транслит запомненного символа и возвращаемся к п. 2.
Forman, пример, который вы привели решается дополнительным проходом /([^\w]\w+)([A-Z])(.+)/gm
где вы получаете второе вхождение и конвертируете его в нижний регистр примерно так $1{($2).toLowerCase()}$3 //(псевдокод).
Что сделать? Интерактивную замену? Описываете известные случае и обрабатываете их, при встрече не известных сочетаний останавливайте цикл и передавайте пользователю ввод с отображением отладочной информации на чем застрял. Простого способа и никакой магии тут не будет, это точно. Выше вам хороший вариант предложили. Какой бы вы не выбрали, ни один не будет простым
Задача в том, чтобы сделать замену латинских символов на кириллические, с сохранением регистра.
При этом количество правил настолько большое, что это трудно реализовать, если прописывать каждый регистр.
Например, есть правила:
C = Ц
Ci = Чи
Cia = Чья
Ciaa = Чиа
Стоит ввести CiAa и все рушится. Таких правил тысяча. Одно 5-буквенное правило, чтобы прописать для него регистр займет около тысячи строк.
Некоторые правила можно упростить через замену по регулярному выражению, но и там есть проблема:
Например, как мне заменить с сохранением регистра следующие строки?
$text = preg_replace('/(A)(cia|cie|cio|ciu|ci|sia|sie|sio|siu|si)/iu', 'Ок$2', $text);
$text = preg_replace('/(a)(cia|cie|cio|ciu|ci|sia|sie|sio|siu|si)/iu', 'ок$2', $text);
Если я применю это на текст:
Acia acia
То результат будет:
Окcia Окcia [оба с большой]
Если я отменю регистронезависимость, убрав флаг i, то мне придется прописывать каждый трехбуквенный вариант 8 раз, семибуквенный - 128 раз, а таких вариантов много.
Вот и получается, что есть две проблемы:
1. Решить задачу простым способом через замену латинских символов на кириллические, с сохранением регистра при таком переносе похоже невозможно.
2. Решить задачу можно огромным количеством правил, но даже при попытках их сократить, даже регулярные выражения не помогают :)
Forman, не уверен, что всё точно понял, но если важен именно регистр первого символа, то можно пойти путём замены этого символа на управляющую конструкцию.