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

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

Автор: Sutar
Дата сообщения: 23.07.2015 18:54
Вот кусок:


Код: $color_advert = Array('4444FF', 'FF0000', 'F900FF', '0064FF', '00E2FF', '06FF00', 'FFC200');
$_POST["text"] = preg_replace("#\[(b)\](.*)\[/\\1\]#iU", "<$1 style=\"color: #". $color_advert[rand(0, count($color_advert))] .";\">$2</$1>", $_POST["text"]);
Автор: Mavrikii
Дата сообщения: 24.07.2015 07:58
Sutar
код то предназначен для bbcode, ну так исправили бы аналогично для вашего, делов то


Код: $text = "<b>1</b><b>2</b>";
$color_advert = array('4444FF', 'FF0000', 'F900FF', '0064FF', '00E2FF', '06FF00', 'FFC200');
echo preg_replace_callback("#<(b)>(.*)</\\1>#iU", function($m) use($color_advert) {
return "<" . $m[1] . " style=\"color: #" . $color_advert[array_rand($color_advert)] . ";\">" .
$m[2] . "</" . $m[1] . ">";
} , $text);
Автор: Sutar
Дата сообщения: 24.07.2015 11:31
Mavrikii

Код: Parse error: syntax error, unexpected T_FUNCTION in D:\localhost\www\profilejs.php on line 107
Автор: Mavrikii
Дата сообщения: 24.07.2015 12:49
Sutar
Не пользуйтесь древней версией php
Иначе тогда делать отдельной функцией - посмотрите приперы в мануале по preg_replace_callback
Автор: Sutar
Дата сообщения: 24.07.2015 17:39
Mavrikii
php-5.6.11 подойдет?
Автор: Mavrikii
Дата сообщения: 24.07.2015 20:03
Sutar

Цитата:
php-5.6.11 подойдет?

зачем спрашивать если можно попробовать или просто почитать мануал?

http://php.net/manual/en/functions.anonymous.php

Цитата:
5.3.0    Anonymous functions become available.

то есть у вас версия была даже ниже этой.
Автор: erroraccount
Дата сообщения: 19.04.2016 11:02
Помогите пожалуйста составить регулярку для фамилий, которые могут иметь такой вид:


Код:
И.И.Иванов
И. И. Иванов
И.Иванов
И. Иванов
Иванов И. И.
Иванов И.
Иванов И.И.
Автор: Vitus_Bering
Дата сообщения: 19.04.2016 12:11
erroraccount

Код:
$pattern = '
/[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[А-ЯЁ][-а-яё]+\b|
[А-ЯЁ]\.\s*[А-ЯЁ][-а-яё]+\b|
[А-ЯЁ][-а-яё]+\s*[А-ЯЁ]\.\s*[А-ЯЁ]\.\b|
[А-ЯЁ][-а-яё]+\s*[А-ЯЁ]\.\b/u';
Автор: erroraccount
Дата сообщения: 19.04.2016 12:30
Спасибо. А почему не хватало этой звездочки? Она добавляет любой символ после пробела или множит пробел?
Автор: Vitus_Bering
Дата сообщения: 19.04.2016 12:45
квантификатор Звёздочка означает 0, 1 или любое число раз ({0,}).
Например, «go*gle» соответствует ggle, gogle, gooooooooooooooooooooogle.
Автор: erroraccount
Дата сообщения: 19.04.2016 13:05
Что-то все равно фамилии с пробелами не удалились. И фамилия с дифисом тоже наполовину осталась.

Добавлено:
Вот весь код целиком. В тексте некоторые фамилии в разных комбинациях. Помогите пожалуйста, чтобы все фамилии можно было удалить.


Код: <?php
$string = 'ЗАВТРАК у тов. В.М.МОЛОТОВА
ПО СЛУЧАЮ ПЯТНАДЦАТИЛЕТИЯ СОВЕТСКО-ТУРЕЦКОГО ДОГОВОРА
В связи с исполнившимся 15-летием первого советско-турецкого договора о дружбе, 23 марта с. г. председатель Совета народных комиссаров Союза ССР тов. В.М.Молотов дал завтрак чрезвычайному и полномочному послу Турецкой республики - г-ну Зекяи Апайдын.
На завтраке присутствовали товарищи: К.Е.Ворошилов, Ворошилов К. Е., Ворошилов К. Е., К. Е. Ворошилов, Л.М.Каганович, Г.К.Орджоникидзе, А.И.Микоян, В.И.Меж-Лаук, Н.К.Антипов, А.П.Розеигольп, Н.Н.Крестинский, А.С.Бубнов, Ю.Л.Пятаков, Б.С.Стомоняков, А.И.Егоров, С.М.Буденный, А.М.Могильный, а также ответственные сотрудники Народного комиссариата по иностранным делам и высшие чины турецкого посольства. Во время завтрака тов. В.М.Молотов и г-н Зекяи Апайдын обменялись приветственными речами.';

$pattern = '
/[А-ЯЁ]\.[А-ЯЁ]\.[А-ЯЁ][а-яё]+\b|
[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[А-ЯЁ][а-яё]+\b|
[А-ЯЁ]\.\s*[А-ЯЁ][а-яё]+\b|
[А-ЯЁ][а-яё]+\s*[А-ЯЁ]\.\s*[А-ЯЁ]\.\b|
[А-ЯЁ][а-яё]+\s*[А-ЯЁ]\.\b|
[А-ЯЁ][а-яё]+\s*[А-ЯЁ]\.[А-ЯЁ]\.\b/u';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);
?>
Автор: Vitus_Bering
Дата сообщения: 19.04.2016 14:44
erroraccount


Код:
$pattern = '[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[А-ЯЁ]+\b';      // для: В.М.МОЛОТОВА     
$pattern .= '|[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[А-ЯЁ][а-яё]+\-[А-ЯЁ][а-яё]+\b'; // для: В.И.Меж-Лаук
$pattern .= '|[А-ЯЁ]\.\s*[А-ЯЁ]\.\s*[-А-ЯЁ][-а-яё]+\b'; // для: В.М.Молотов
$pattern .= '|[А-ЯЁ][а-яё]+\s+[А-ЯЁ]\.\s*[А-ЯЁ]\.\,*';      // для: Ворошилов К. Е. Ворошилов К.Е.     
    
$string = preg_replace("/$pattern/us", '', $string);
Автор: Mavrikii
Дата сообщения: 19.04.2016 19:43
erroraccount

Цитата:
[А-ЯЁ][а-яё]+\s*[А-ЯЁ]\.\s*[А-ЯЁ]\.\b|
[А-ЯЁ][а-яё]+\s*[А-ЯЁ]\.\b|

как вы думаете представляется перенос строки и что он делает в этой ситуации?
Автор: erroraccount
Дата сообщения: 19.04.2016 21:08
Скажите как можно поменять регистр первой буквы на нижний?
Автор: Vitus_Bering
Дата сообщения: 19.04.2016 21:19
erroraccount

Код: $string = str_replace($string[0], strtolower($string[0]), $string);
Автор: erroraccount
Дата сообщения: 19.04.2016 21:31
Спасибо. Но у меня не получилось.
Надо чтобы начало каждого массива начиналось с маленькой буквы. Каждый массив соответствует одному предложению. Мне надо начало предложения привести к нижнему регистру, в то время, как слова с заглавной буквы которые находятся внутри предложения оставить в верхнем регистре.

Сейчас вид такой:


Код: <?php
$string = 'ЗАВТРАК у тов. В.М.МОЛОТОВА
ПО СЛУЧАЮ ПЯТНАДЦАТИЛЕТИЯ СОВЕТСКО-ТУРЕЦКОГО ДОГОВОРА
В связи с исполнившимся 15-летием первого советско-турецкого договора о дружбе, 23 марта с. г. председатель Совета народных комиссаров Союза ССР тов. В.М.Молотов дал завтрак чрезвычайному и полномочному послу Турецкой республики - г-ну Зекяи Апайдын.
На завтраке присутствовали товарищи: К.Е.Ворошилов, Ворошилов К. Е., Ворошилов К. Е., К. Е. Ворошилов, Л.М.Каганович, Г.К.Орджоникидзе, А.И.Микоян, В.И.Меж-Лаук, Н.К.Антипов, А.П.Розеигольп, Н.Н.Крестинский, А.С.Бубнов, Ю.Л.Пятаков, Б.С.Стомоняков, А.И.Егоров, С.М.Буденный, А.М.Могильный, а также ответственные сотрудники Народного комиссариата по иностранным делам и высшие чины турецкого посольства. Во время завтрака тов. В.М.Молотов и г-н Зекяи Апайдын обменялись приветственными речами.';

$string = preg_replace('/\s[А-ЯЁ-яё]\./u', ' ', $string);
$string = preg_replace('/\s[А-ЯЁ-яё]\./u', '', $string);
$keywords = preg_split('#(?<=(\.|\!|\?))\s#s', $string);
print_r($keywords);
?>
Автор: Mavrikii
Дата сообщения: 20.04.2016 00:33
erroraccount
ну.. для начала определитесь с предложениями.

Цитата:
ЗАВТРАК у тов. В.М.МОЛОТОВА
        ПО СЛУЧАЮ ПЯТНАДЦАТИЛЕТИЯ СОВЕТСКО-ТУРЕЦКОГО ДОГОВОРА

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

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

можно сделать, к примеру, так (разбивает на предложения по точкам, если перед ними больше 3 букв)

Код: $sentences = preg_split('/(?<!\b\w)(?<!\b\w\w)(?<!\b\w\w\w)\./u', $string, 0, PREG_SPLIT_NO_EMPTY);
foreach($sentences as &$s)
{
$s = trim($s);
$s = mb_strtolower(mb_substr($s, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($s, 1, mb_strlen($s), 'UTF-8');
}
var_dump($sentences);
Автор: erroraccount
Дата сообщения: 20.04.2016 09:04

Цитата:
можно сделать, к примеру, так (разбивает на предложения по точкам, если перед ними больше 3 букв)


Спасибо вам, добрый человек. На основе вашего примера сделал все что нужно. Теперь все фамилии, имена собственные и инициалы удалены. Фамилии остались только набранные капсом, но эта небольшая погрешность, в сравнении с тем, какое количество не нужных слов удалено.

Вот что сейчас выходит:


Код:
array(3) { [0]=> string(509) "зАВТРАК у МОЛОТОВА ПО СЛУЧАЮ ПЯТНАДЦАТИЛЕТИЯ СОВЕТСКО-ТУРЕЦКОГО ДОГОВОРА В связи с исполнившимся 15-летием первого советско-турецкого договора о дружбе, 23 марта председатель народных комиссаров ССР дал завтрак чрезвычайному и полномочному послу республики - г-ну" [1]=> string(295) "завтраке присутствовали товарищи: , , , , , , , - , , , , , , , , , , а также ответственные сотрудники комиссариата по иностранным делам и высшие чины турецкого посольства" [2]=> &string(104) "время завтрака и г-н обменялись приветственными речами" }
Автор: Mavrikii
Дата сообщения: 20.04.2016 09:10
erroraccount

Цитата:
Подскажите пожалуйста, как от них избавиться, чтобы они не попадали в подсчет и сравнение слов?

они и не должны путаться или попадаться.
var_dump используется для показа типа переменной и ее значения, а не для вывода. так проще показать содержимое массива, а уж как на самом деле хотите вывести и куда - от вас зависит.
Автор: erroraccount
Дата сообщения: 20.04.2016 10:34

Цитата:
они и не должны путаться или попадаться.
var_dump используется для показа типа переменной и ее значения, а не для вывода. так проще показать содержимое массива, а уж как на самом деле хотите вывести и куда - от вас зависит.

Вывожу так, но выводит только слово Array

Код: echo $sentences;
Автор: Vitus_Bering
Дата сообщения: 20.04.2016 14:42

Цитата:
Вывожу так, но выводит только слово Array

Массив в строку implode(...
Автор: Mavrikii
Дата сообщения: 20.04.2016 19:24
erroraccount

Цитата:
Вывожу так, но выводит только слово Array

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

echo implode('. ', $sentences);
если нужно соединить обратно с точкой. если не нужно - точку убрать.
Автор: erroraccount
Дата сообщения: 20.04.2016 21:06

Цитата:
зачем вы выбрали язык, у которого не знаете даже основы?

Да я не выбирал. Это он сам. )) Вообще стараюсь учиться, но я пока в самом начале пути.

Сейчас все предложения сваливаются в один абзац. Хоть и вывожу через nl2br:


Код: echo nl2br(implode('. ', $sentences));
Автор: Mavrikii
Дата сообщения: 20.04.2016 21:11
erroraccount

Цитата:
Как можно вернуть абзацы, подскажите пожалуйста.

trim уберите
правда без него, скорее всего, не будет опускаться первая буква )
Автор: erroraccount
Дата сообщения: 20.04.2016 21:21
Трим убрал. Появился один <br>. А всего строк (абзацев) должно быть 7. Как их вернуть, помогите пожалуйста.

Код: $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 = trim($s);
$s = mb_strtolower(mb_substr($s, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($s, 1, mb_strlen($s), 'UTF-8');
}
$sentences = preg_replace('/\s*[А-ЯЁA-Z][а-яёa-z]+/u', ' ', $sentences);
echo nl2br(implode('. ', $sentences));
Автор: Mavrikii
Дата сообщения: 20.04.2016 21:27
erroraccount
ну сами, сами.. хоть чуть чуть

Код: foreach($sentences as &$s)
$s = preg_replace('/^\s+(\w)/ue', "mb_strtolower('$1', 'UTF-8')", $s);
Автор: erroraccount
Дата сообщения: 20.04.2016 21:51

Цитата:
ну сами, сами.. хоть чуть чуть

Честное слово, хочется вас порадовать, но пока не могу ))
Это тоже не помогает. Нашел в сети array array_map() это может помочь?
Автор: Mavrikii
Дата сообщения: 20.04.2016 21:56
erroraccount

Цитата:
Это тоже не помогает. Нашел в сети array array_map() это может помочь?

нет..
что именно не помогает? у меня отображает так, как было изначально, с нужными изменениями.
Автор: erroraccount
Дата сообщения: 20.04.2016 22:23
Так правильно?

Код: foreach($sentences as &$s)
$s = preg_replace('/^\s+(\w)/ue', "mb_strtolower('$1', 'UTF-8')", $s);
{
$s = trim($s);
$s = mb_strtolower(mb_substr($s, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($s, 1, mb_strlen($s), 'UTF-8');
}
$sentences = preg_replace('/\s*[А-ЯЁA-Z][а-яёa-z]+/u', ' ', $sentences);
echo implode('. ', $sentences);
Автор: Mavrikii
Дата сообщения: 20.04.2016 22:27
erroraccount

Цитата:
Так правильно?

нет. изучите основы языка.
{
}
показывает блок, который выполняется в цикле foreach. я написал кусок, который заменяет его (и начало цикла) полностью

Код:
foreach($sentences as &$s)
$s = preg_replace('/^\s+(\w)/ue', "mb_strtolower('$1', 'UTF-8')", $s);
echo implode('. ', $sentences);

Страницы: 12345678910111213141516171819202122232425262728293031323334

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


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