За последние 24 часа нас посетили 20472 программиста и 1095 роботов. Сейчас ищут 389 программистов ...

Нужна помощь с регулярными выражениями

Тема в разделе "PHP для новичков", создана пользователем Elf-Alex, 29 июл 2016.

  1. Elf-Alex

    Elf-Alex Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    21
    Симпатии:
    0
    Здравствуйте. Сразу извиняюсь за то, что мучаюсь не своим делом (я гуманитарий и уже голова дымится), но причина уважительная: больше сделать некому.

    Итак, нужно в тексте сделать замену повторяющейся последовательности одних и тех же текстовых символов, точное количество которых заранее не известно (но лежит в известном диапазоне -- от 65 до 80) точно такой же последовательностью, к которой добавить заранее определённую последовательность других текстовых символов. Искомая последовательность встречается в тексте дважды. К первой найденной нужно добавить в начало, а ко во второй -- в конец.

    Текст на входе:

    ----------------------------------------------------------------------
    (Информация об источнике текста книги,
    найденных и исправленных опечатках и т.п.).
    ----------------------------------------------------------------------

    Результат, который нужно получить на выходе:

    <pre>
    ----------------------------------------------------------------------
    (Информация об источнике текста книги,
    найденных и исправленных опечатках и т.п.).
    ----------------------------------------------------------------------
    </pre>

    Если я правильно понял, здесь надо использовать preg_replace. Нужно только составить два регулярных выражения (что заменить и чем наменить). И вот с этим я уже промучился весь день... Помогите, пожалуйста. Заранее благодарю.
     
  2. Anhk

    Anhk Активный пользователь

    С нами с:
    13 дек 2015
    Сообщения:
    219
    Симпатии:
    11
    опережу завсегдатаев: показывай как ты пробовал, это раздел для новичков. в противном случае в другие разделы.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
  4. Elf-Alex

    Elf-Alex Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    21
    Симпатии:
    0
    Для начала пробовал с одним рег. выражением:

    PHP:
    1. echo preg_replace('/-{3,90}/', '<pre>', $content);
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @Elf-Alex, ты не заметил, я тебе дал решение. Можешь добавить туда твои {3,90}. Самое главное, обрати внимание на скобки в регулярке и $1 в замене, почитать можно в доке по preg_replace
     
  6. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    @mkramer, а если в самом тексте описания встретится дефис то шаблон [^\-]*? не сработает
     
  7. Elf-Alex

    Elf-Alex Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    21
    Симпатии:
    0
    Спасибо огромное! Я просто почему-то испугался, что это какая-нибудь злая шутка... Наверное, от переутомления. :-/
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @Emilien, да. Тут я не знаю, как решить. Хотя если ТС вставит свои {3,90}, то можно [^\-]* заменить просто на .*, и не будут срабатывать только 3 и более тире подряд.
     
  9. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Ну например так
    PHP:
    1. $text1 = preg_replace('!^(-{65,}).*?^\1!ms', "<pre>\n\$0\n</pre>", $text);
    Ищем начало строки и не менее 65 дефисов и далее до ближайшей новой строки с тем же количеством дефисов.
     
  10. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
  11. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    @Chushkin, там наверно опечатка \h* вместо \n*
     
  12. Elf-Alex

    Elf-Alex Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    21
    Симпатии:
    0
    В PHP Sandbox работает правильно, а на сервере -- нет. Почему?
     
  13. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Какая версия php на сервере?
     
  14. Elf-Alex

    Elf-Alex Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    21
    Симпатии:
    0
  15. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Нет.
     
  16. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Ну, глянь версию на сендбоксе
    --- Добавлено ---
    И кодировка файла какая?
     
  17. Elf-Alex

    Elf-Alex Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    21
    Симпатии:
    0
    Кодировка однобайтная.
     
  18. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Может стоит использовать utf8?
     
  19. Elf-Alex

    Elf-Alex Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    21
    Симпатии:
    0
    Сейчас попробовал выполнить код с PHP Sandbox'a на сервере в отдельном файле test.php. И всё работает точно так же. Так что это где-то из моей программы ошибка вылезает. Буду искать завтра, а сейчас надо проспаться. :)
    Всем большое спасибо и респект!
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    PHP:
    1. $arr = explode('------', $text);
    2. foreach ($arr as &$val) {
    3.   $val = '<pre>' . trim($val, '-') . '</pre>';
    4. }
    5. var_dump($arr);
    как вариант
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    А, я вкурил. Невнимательно прочитал. Не подходит моё решение.
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631