Как переписать скрипт с регулярками с perl на php?

Тема в разделе "Регулярные выражения", создана пользователем General Fizz, 11 фев 2008.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. General Fizz

    General Fizz Боевой Генерал :)

    Регистр.:
    11 апр 2007
    Сообщения:
    753
    Симпатии:
    396
    В общем есть задача автоматической расстановки переносов для русских слов. Алгоритм ее следующий:
    Код:
    К тексту последовательно применяются шесть правил-замен:
    1. х → х-
    2. гг → г-г
    3. гссг → гс-сг
    4. сгсг → сг-сг
    5. гсссг→ гс-ссг
    6. гссссг → гсс-ссг
    «х» — одна из букв «ьъй», «c» — согласная, «г» — гласная, «-» — вставляемый знак переноса
    Реализация на Javascript:
    Код:
    var RusA = "[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]";
    var RusV = "[аеёиоуыэю\я]";
    var RusN = "[бвгджзклмнпрстфхцчшщ]";
    var RusX = "[йъь]";
    var Hyphen = "\xAD";
    
    var re1 = new RegExp("("+RusX+")("+RusA+RusA+")","ig");
    var re2 = new RegExp("("+RusV+")("+RusV+RusA+")","ig");
    var re3 = new RegExp("("+RusV+RusN+")("+RusN+RusV+")","ig");
    var re4 = new RegExp("("+RusN+RusV+")("+RusN+RusV+")","ig");
    var re5 = new RegExp("("+RusV+RusN+")("+RusN+RusN+RusV+")","ig");
    var re6 = new RegExp("("+RusV+RusN+RusN+")("+RusN+RusN+RusV+")","ig");
    
    text = text.replace(re1, "$1"+Hyphen+"$2");
    text = text.replace(re2, "$1"+Hyphen+"$2");
    text = text.replace(re3, "$1"+Hyphen+"$2");
    text = text.replace(re4, "$1"+Hyphen+"$2");
    text = text.replace(re5, "$1"+Hyphen+"$2");
    text = text.replace(re6, "$1"+Hyphen+"$2");
    
    Также эта задача решена на perl следующим образом:
    Код:
    $RusAll = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    $RusV = "аеёиоуыэюя";
    $RusN = "бвгджзклмнпрстфхцчшщ";
    $RusX = "ьъй";
    $Hyphen = "-";
    
    $text =~ s/(?<=[$RusAll])([$RusX])(?=[$RusAll]{2})/\1$Hyphen/ig;
    $text =~ s/(?<=[$RusAll])([$RusV])(?=[$RusV][$RusAll])/\1$Hyphen/ig;
    $text =~ s/(?<=[$RusV])([$RusN])(?=[$RusN][$RusV])/\1$Hyphen/ig;
    $text =~ s/(?<=[$RusN])([$RusV])(?=[$RusN][$RusV])/\1$Hyphen/ig;
    $text =~ s/(?<=[$RusV])([$RusN])(?=[$RusN][$RusN][$RusV])/\1$Hyphen/ig;
    $text =~ s/(?<=[$RusV][$RusN])([$RusN])(?=[$RusN][$RusN][$RusV])/\1$Hyphen/ig;
    Как этот код переписать на php?

    Или может кому известно уже готовое решение?
     
  2. Alexitdv

    Alexitdv

    Регистр.:
    4 янв 2008
    Сообщения:
    161
    Симпатии:
    65
    PHP:
    $RusAll "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    $RusV "аеёиоуыэюя";
    $RusN "бвгджзклмнпрстфхцчшщ";
    $RusX "ьъй";
    $Hyphen "-";

    $text preg_replace("#(?<=[$RusAll])([$RusX])(?=[$RusAll]{2})#ig","#\1$Hyphen#"$text);
    B так далее... Функция preg_replace("Что_меняем", "На_что_меняем","где_меняем").
    Перл совместимые регулярные выражения.
     
  3. General Fizz

    General Fizz Боевой Генерал :)

    Регистр.:
    11 апр 2007
    Сообщения:
    753
    Симпатии:
    396
    Не работает. В пхп перл-совместимых регулярных выражениях нет модификатора g. При подставлении указанного шаблона
    Код:
    $text = preg_replace("#(?<=[$RusAll])([$RusX])(?=[$RusAll]{2})#ig","#\1$Hyphen#", $text);  
    на выходе полный бред с "#" и пропавшими буквами.
     
  4. Alexitdv

    Alexitdv

    Регистр.:
    4 янв 2008
    Сообщения:
    161
    Симпатии:
    65
    Оп. Скосипорил :D. G убарть ф топку он и так заменяет все вхождения, а второй параметр так "\\1$Hyphen" или так
    PHP:
    "\\1" $Hyphen
     
    General Fizz нравится это.
Статус темы:
Закрыта.