Ru-Board.club
← Вернуться в раздел «Web-программирование»

» PHP: Регулярные выражения (RegExp, Regular, eregi, preg)

Автор: erroraccount
Дата сообщения: 20.04.2016 22:31
Нет. В скобки я ставил тоже. И заменял. Вы правы, основ языка не знаю, но в скобки ставил и заменял и местами менял. Все равно не выходит.
Автор: Mavrikii
Дата сообщения: 20.04.2016 22:33
erroraccount
что именно не выходит?

Код: $sentences = preg_split('/(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\./u', $string, 0, PREG_SPLIT_NO_EMPTY);
foreach($sentences as &$s)
$s = preg_replace('/^\s+(\w)/ue', "mb_strtolower('$1', 'UTF-8')", $s);
echo implode('. ', $sentences);
Автор: erroraccount
Дата сообщения: 20.04.2016 22:34
У меня с этим текстом не выходит.

Код:
<?php
$string = 'Ровный золотистый свет луны заливал высокий дом, стоящий на сваях, как на ходулях, освещал ребятишек и взрослых, сидящих на высоком помосте — открытом крыльце — вокруг старого Тхыонга, деда-сказочника. Невдалеке сквозь тропическую ночь скорее угадывались, чем виднелись силуэты невысоких, сгорбленных, как черепахи, вьетнамских гор. Размеренно и напевно лилась речь — дед рассказывал сказки.
В них, как и в сказках всех народов мира, жила дерзновенная мечта человека о счастье, о чудесных предметах и чудесах: ковре-самолете и тысячемильных туфлях, о дворцах, возникающих по волшебству, и о необыкновенных, огромных рисовых зернах.
Сказка — удивительное творение человеческого гения, она возвышает человека, радует его, дает веру в свои силы, в будущее, увлекает достижимостью того, что кажется вроде бы совершенно невозможным...
Наутро я прощался с дедом Тхыонгом, и еще долго слышались мне мелодичные и величавые звуки гонга, доносившиеся из его дома, где собрались люди по случаю отъезда советско-вьетнамской экспедиции фольклористов.
Конечно, сказки слушали и слушают и в русских избах, и в африканских хижинах, крытых пальмовыми листьями. Словом, всюду. Но теперь, чтобы познакомиться со сказками почти любого народа мира, не обязательно слушать сказочника, достаточно протянуть руку к полке с книгами: ныне эти сказки переведены на многие языки, стали осознанно важным явлением мировой культуры, без которого она оказалась бы далеко не полной, а детство каждого из нас — лишенным чего-то важного.
Но так было далеко не всегда, и Пушкин в 1824 году в своем письме из ссылки — села Михайловского — сетовал и восхищался: «Вечером слушаю сказки — и вознаграждаю тем недостатки проклятого своего воспитания. Что за прелесть эти сказки! Каждая есть поэма!»
Разумеется, что сказки, оказавшись зафиксированными в книге, вышедшей многотысячным тиражом, сохранятся для грядущих поколений. Их прочтут и те, кто никогда в жизни не увидит сказочника или сказочницу. Но, не будучи свидетелями мастерского исполнения таких сказочников, как дед Тхыонг, мы многое потеряем. Ведь дед и напевно декламировал, и подражал гомону птиц, рокоту горных потоков, рычанию тигров и трубным звукам слонов. Он имитировал шум джунглей, крик обезьян, звон ручья. Словом, это был своеобразный театр одного актера, тем более что сказочник дополнял выразительность своего выступления еще и жестом. О том, сколь важную роль в жизни людей играло устное творчество, говорит тот факт, что в пантеоны местных культов разных народов входили боги или духи — покровители певцов, сказителей и сказочников.';

$string = preg_replace('/[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[А-ЯЁ]+\b/u', ' ' , $string); // для: В.М.МОЛОТОВА
$string = preg_replace('/[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[А-ЯЁ][а-яё]+\-[А-ЯЁ][а-яё]+\b/u', ' ' , $string); // для: В.И.Меж-Лаук
$string = preg_replace('/[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[-А-ЯЁ][-а-яё]+\b/u', ' ' , $string); // для: В.М.Молотов
$string = preg_replace('/[А-ЯЁ][а-яё]+\s+[А-ЯЁ]\.\s*[А-ЯЁ]\.\,*/u', ' ' , $string); // для: Ворошилов К. Е. Ворошилов К.Е.
$string = preg_replace('/[A-Z]+\b/u', ' ' , $string);

$string = preg_replace('/\s[А-ЯЁа-яё]\./u', ' ', $string);
$string = preg_replace('/\s[А-ЯЁа-яё]\./u', ' ', $string);
$string = preg_replace('/\s[А-ЯЁа-яё]{2,3}\./u', ' ', $string);
$sentences = preg_split('/(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\./u', $string, 0, PREG_SPLIT_NO_EMPTY);
foreach($sentences as &$s)
$s = preg_replace('/^\s+(\w)/ue', "mb_strtolower('$1', 'UTF-8')", $s);
    $sentences = preg_replace('/\s*[А-ЯЁA-Z][а-яёa-z]+/u', ' ', $sentences);
echo implode('. ', $sentences);
?>
Автор: Mavrikii
Дата сообщения: 20.04.2016 22:41
erroraccount

Цитата:
У меня с этим текстом не выходит.

сложно с вами. не выходит что? укажите какой результат ожидается, так как у вас тут нет имен с инициалами и тд и тп.
Автор: erroraccount
Дата сообщения: 20.04.2016 23:15
Да, простите. Сам понимаю, что сложно со мной, но большое спасибо что возитесь ))

Если закинуть текст из нескольких абзацев, то после обработки они сливаются и текст идет в одну строку.
А надо, чтобы после обработки текст выводился абзацами.

Вот тут я вывел первый блок, как сейчас с обработкой, а второй блок без обработки, но абзацы сохранены.


Код:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Document</title>
</head>
<body>


<?php
$string = 'Ровный золотистый свет луны заливал высокий дом, стоящий на сваях, как на ходулях, освещал ребятишек и взрослых, сидящих на высоком помосте.
В них, как и в сказках всех народов мира.
Сказка — удивительное творение человеческого гения...
Наутро я прощался с дедом Тхыонгом, и еще долго слышались.
Конечно, сказки слушали и слушают и в русских избах.
Но так было далеко не всегда, и Пушкин в 1824 году.
Разумеется, что сказки, оказавшись зафиксированными в книге.';

$string = preg_replace('/[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[А-ЯЁ]+\b/u', ' ' , $string); // для: В.М.МОЛОТОВА
$string = preg_replace('/[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[А-ЯЁ][а-яё]+\-[А-ЯЁ][а-яё]+\b/u', ' ' , $string); // для: В.И.Меж-Лаук
$string = preg_replace('/[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[-А-ЯЁ][-а-яё]+\b/u', ' ' , $string); // для: В.М.Молотов
$string = preg_replace('/[А-ЯЁ][а-яё]+\s+[А-ЯЁ]\.\s*[А-ЯЁ]\.\,*/u', ' ' , $string); // для: Ворошилов К. Е. Ворошилов К.Е.
$string = preg_replace('/[A-Z]+\b/u', ' ' , $string);

$string = preg_replace('/\s[А-ЯЁа-яё]\./u', ' ', $string);
$string = preg_replace('/\s[А-ЯЁа-яё]\./u', ' ', $string);
$string = preg_replace('/\s[А-ЯЁа-яё]{2,3}\./u', ' ', $string);
$sentences = preg_split('/(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\./u', $string, 0, PREG_SPLIT_NO_EMPTY);
foreach($sentences as &$s)
$s = preg_replace('/^\s+(\w)/ue', "mb_strtolower('$1', 'UTF-8')", $s);
$sentences = preg_replace('/\s*[А-ЯЁA-Z][а-яёa-z]+/u', ' ', $sentences);

echo implode('. ', $sentences);
?>
<br><br><br>
<?php echo nl2br($string); ?>
</body>
</html>
Автор: Mavrikii
Дата сообщения: 20.04.2016 23:22
erroraccount
1) повторюсь еще раз.. меня не интересует код, меня интересует какой текст на входе и что получаете на выходе. чтобы понять какие именно действия нужны и что получается не так, как вам хочется.

2) я же написал, что html игнорирует пробелы и так далее.
если есть обычный текст, то и выводите его в теге <pre></pre>
http://htmlbook.ru/html/pre
Автор: erroraccount
Дата сообщения: 21.04.2016 05:41

Цитата:
повторюсь еще раз.. меня не интересует код

Мое сообщение осталось на другой странице, вы видимо не заметили, я там подправил. Вставил скрин, где на одну и ту же страницу выводятся два блока. Один блок разбит на "абзацы", с помощью <br> а другой одной строкой.
Если html игнорирует пробелы и т.д., то в этом случае оба текста на одной странице, поэтому кажется что это из-за обработки, когда смена регистра происходит.

Добавлено:

Цитата:
повторюсь еще раз.. меня не интересует код

Мое сообщение осталось на другой странице и вы не увидели, я там подправил и вставил скрин, на котором два блока выводятся на одну страницу. Один блок с переносом строк, а тот, к которому применялась обработка со сменой регистра, в одну строку.
Получается html тут не при чем. Ведь второй блок html выводит с переносом строк.
Автор: Mavrikii
Дата сообщения: 21.04.2016 06:50
erroraccount
вот так, на примерах, и нужно показывать ) вот

Код: $sentences = preg_split('/(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\./u', $string, 0, PREG_SPLIT_NO_EMPTY);
$sentences = preg_replace('/(^\s*\w)/ue', "mb_strtolower('$1', 'UTF-8')", $sentences);
echo '<pre>' . implode('.', $sentences) . '.</pre>';
Автор: erroraccount
Дата сообщения: 21.04.2016 22:16
Помогите пожалуйста.
Если предложение не заканчивается точкой, то дальнейшая обработка удаляет слово в начале строки.



Код: $sentences = preg_split('/(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\./u', $string, 0, PREG_SPLIT_NO_EMPTY);
$sentences = preg_replace('/(^\s*\w)/ue', "mb_strtolower('$1', 'UTF-8')", $sentences);
$sentences = preg_replace('/[А-ЯЁA-Z][а-яёa-z]+/u', ' ', $sentences);
Автор: Mavrikii
Дата сообщения: 21.04.2016 22:23
erroraccount
помочь с чем? вы сами сказали так сделать

Цитата:
$sentences = preg_replace('/[А-ЯЁA-Z][а-яёa-z]+/u', ' ', $sentences);

так как нет точки, то нет и конца-начала предложения в этом месте - удаляете слово с большой буквы, как вы определите что там делать?
Автор: erroraccount
Дата сообщения: 21.04.2016 22:31
Я сделал так:

Код: $sentences = preg_split('/(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\.|(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\n/u', $string, 0, PREG_SPLIT_NO_EMPTY);
Автор: Mavrikii
Дата сообщения: 21.04.2016 22:41
erroraccount

Цитата:
Я сделал так:

смысл? будет предложение с переносом строки \n - посчитается как два разных предложения. для этого не нужны даже (?< и так далее.. вы пытаетесь методом тыка, не представляя логику работы в целом.


Цитата:
Подскажете как от точек в начале избавиться?


Цитата:
echo '<pre>' . implode('.', $sentences) . '.</pre>';

у вас в $sentences есть элементы просто с переносом строки - так как разбиение идет и по переносу строки и по точке. если есть оба - появляется элемент в массиве с символом переноса строки. фильтровать - перебирать и убирать/исправлять ненужное.

к примеру так

Код: $sentences = preg_split('/(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\.|\r?\n/u', $string, 0, PREG_SPLIT_NO_EMPTY);
$sentences = preg_replace('/(^\s*\w)/ue', "mb_strtolower('$1', 'UTF-8')", $sentences);
echo '<pre>' . implode(".\n", $sentences) . '.</pre>';
Автор: erroraccount
Дата сообщения: 21.04.2016 22:51

Цитата:
но это все костыли

Спасибо и за костыли. )) Так Работает.

Добавлено:
Сейчас все работает. Но хочу спросить, можно ли регуляркой найти строчку, которая заканчивается словом без точки и не заменять ее, а после найденной строки поставить точку? Просто представлялось, что можно добавить в конце строк недостающие точки, если их там нет и этой проблемы бы не было. Или так не делается?
Автор: Mavrikii
Дата сообщения: 21.04.2016 23:48
erroraccount

Цитата:
если их там нет и этой проблемы бы не было. Или так не делается?

да все можно, но судя по показанными вами вариантов текстов - перенос строки не всегда является окончанием предложения.

например так
$string = preg_replace('/(?<!\.)(\s*?\r?\n|$)/U', ".$0", $string);
Автор: cob
Дата сообщения: 25.05.2016 13:52
Не знаю при чем тут web-программирование, но выдирать урлы из html-страниц для прог закачки помогают следующие примеры:

(http://.*?.(mp3|mpg|wav)) - найти все линки, заканчивающиеся на mp3 или..

(http://.*.avi) - найти все линки, заканчивающиеся на avi

(http://.*.filmiki/.*.avi) - найти все линки, заканчивающиеся на avi и содержащие в пути имя папки filmiki

(\">.*$) - найти (и убрать (заменой)) все символы, начиная с "> и до конца строки

Наверное, можно проще или софтом, но я пока ничего другого не нашел..
Открываю файлы в AkelPad или NotePad++ и там можно в поиске и замене применять рег.выражения.

---
Автор: Mavrikii
Дата сообщения: 25.05.2016 16:25
cob
это вопрос или что? более того, ваши регулярки без специального модификатора (кроме первой) могут повести себя плохо, так как "жадные".
Автор: cob
Дата сообщения: 03.06.2016 13:08
Mavrikii Это пример обработки HTML с линками внутри. Проверено - работает. Предложите лучший вариант?

Добавить символы в начало строки (с помощью замены) - ^
Добавить символы в конец строки (с помощью замены) - $

---
Автор: Mavrikii
Дата сообщения: 03.06.2016 20:01
cob

Цитата:
Проверено - работает. Предложите лучший вариант?

даже если и работает, при чем тут данная тема?
в php без модификатора жадности правильно работать не будет.

более того, вы не экранируете точки (например в .avi), а значит вместо точки может пойматься любой символ. в текстовых редактор бывают несколько упрощенные варианты регулярок. но, опять же, здесь спрашивают, а не просто публикуют.
Автор: ivanmara
Дата сообщения: 19.07.2016 19:11
Добрый день. Подскажите как составить рег выражение.

Есть строка с названием телеканала и номером перед названием, например:

#EXTINF:-1,6 365 дней ТВ

Как убрать номер канала из строки что бы получилось:

#EXTINF:-1,365 дней ТВ

Заранее благодарен

Автор: Mavrikii
Дата сообщения: 19.07.2016 20:28
ivanmara
$str = preg_replace('/(#EXTINF:-\d+,)\d+\s+(\d+)/', '$1$2', $str);
Автор: avangard11
Дата сообщения: 21.07.2016 16:08
вариант [^abc] - любой символ кроме abc.
Автор: Mavrikii
Дата сообщения: 21.07.2016 19:50
avangard11
и к чему (зачем) это было написано?
Автор: D1D1D1D
Дата сообщения: 21.08.2016 14:25
Интересует, как задать в исключаемом перечне (в этом: [^символы]) совпадение не по одному, а разом по двум, трём символам (тег, например)? То есть, чтобы группа символов в диапазоне рассматривалась как единое целое, или как один символ?
Автор: Mavrikii
Дата сообщения: 22.08.2016 21:28
D1D1D1D

Цитата:
То есть, чтобы группа символов в диапазоне рассматривалась как единое целое, или как один символ?

примеры нужно показывать. в общем случае (но могу понимать не так, примеры) [^символы]{1,3} - от 1 до 3

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: Xitami Web Server + PHP+ zend optimizer


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.