Здравствуйте. Сразу извиняюсь за то, что мучаюсь не своим делом (я гуманитарий и уже голова дымится), но причина уважительная: больше сделать некому. Итак, нужно в тексте сделать замену повторяющейся последовательности одних и тех же текстовых символов, точное количество которых заранее не известно (но лежит в известном диапазоне -- от 65 до 80) точно такой же последовательностью, к которой добавить заранее определённую последовательность других текстовых символов. Искомая последовательность встречается в тексте дважды. К первой найденной нужно добавить в начало, а ко во второй -- в конец. Текст на входе: ---------------------------------------------------------------------- (Информация об источнике текста книги, найденных и исправленных опечатках и т.п.). ---------------------------------------------------------------------- Результат, который нужно получить на выходе: <pre> ---------------------------------------------------------------------- (Информация об источнике текста книги, найденных и исправленных опечатках и т.п.). ---------------------------------------------------------------------- </pre> Если я правильно понял, здесь надо использовать preg_replace. Нужно только составить два регулярных выражения (что заменить и чем наменить). И вот с этим я уже промучился весь день... Помогите, пожалуйста. Заранее благодарю.
опережу завсегдатаев: показывай как ты пробовал, это раздел для новичков. в противном случае в другие разделы.
http://sandbox.onlinephpfunctions.com/code/ed1aad124e40658f0ba6104012f5f90bc408bb65. Было интересно поиграться.
@Elf-Alex, ты не заметил, я тебе дал решение. Можешь добавить туда твои {3,90}. Самое главное, обрати внимание на скобки в регулярке и $1 в замене, почитать можно в доке по preg_replace
Спасибо огромное! Я просто почему-то испугался, что это какая-нибудь злая шутка... Наверное, от переутомления. :-/
@Emilien, да. Тут я не знаю, как решить. Хотя если ТС вставит свои {3,90}, то можно [^\-]* заменить просто на .*, и не будут срабатывать только 3 и более тире подряд.
Ну например так PHP: $text1 = preg_replace('!^(-{65,}).*?^\1!ms', "<pre>\n\$0\n</pre>", $text); Ищем начало строки и не менее 65 дефисов и далее до ближайшей новой строки с тем же количеством дефисов.
Сейчас попробовал выполнить код с PHP Sandbox'a на сервере в отдельном файле test.php. И всё работает точно так же. Так что это где-то из моей программы ошибка вылезает. Буду искать завтра, а сейчас надо проспаться. Всем большое спасибо и респект!
PHP: $arr = explode('------', $text); foreach ($arr as &$val) { $val = '<pre>' . trim($val, '-') . '</pre>'; } var_dump($arr); как вариант
Предложу свой вариант PHP: $text = preg_replace('/-{65,80}.+?-{65,80}/s', '<pre>$0</pre>', $text); http://sandbox.onlinephpfunctions.com/code/0a653c218f1adf694fb502d8f7bdc550cbf23d41