Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения, злостная вещь 
:(
    Опции темы
starmaster
Дата 24.1.2006, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 29.3.2004

Репутация: нет
Всего: нет



Какие мануалы я только не читал про регулярные выражения, всё равно они мне не понятны... Ну уже любая вещь в PHP ясна как день кроме рег. выражений... Вроде бы что-то понятно, но на практике почему-то редко когда какой-то шаблон работает... Остались неясными следущие случаи, например:

1) Дана строка. В ней могут содержаться как большие, так и маленькие буквы, символ подчёркивания. При том, в строке не может быть только один символ подчёркивания в любом количестве (без букв)...
2) В строке перед тегами <b> поставить тег <i> а после </b> - соответственно </i>
3) В строке у каждого незакрытого а) тега <b> б) любого тега поставить в закрывающем тэге слэш "/" Например, дана строка идфоадл<b>;dsf<b>//fsd Должно получиться идфоадл<b>;dsf</b>//fsd

Использовать только один шаблон... Вот как раз приёмы реализации этих случаев в регулярных выражениях мне неясны... Помогите разобраться...
PM MAIL WWW ICQ   Вверх
BIG BROTHER
Дата 24.1.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 9.12.2004
Где: Россия, Москва

Репутация: 1
Всего: 4



1. #[a-z_]#is
2. preg_replace("#<b>(.*?)</b>#is", "<i><b>//1</b></i>", $str);
3. что-то не придумывается никак

Вроде должно работать smile
--------------------
Mess with the best, die like the rest
PM MAIL ICQ   Вверх
skalex
Дата 24.1.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 0
Всего: 23



Цитата
1) Дана строка. В ней могут содержаться как большие, так и маленькие буквы, символ подчёркивания. При том, в строке не может быть только один символ подчёркивания в любом количестве (без букв)...

Не совсем понятно ... Поподробнее можешь?

Цитата
2) В строке перед тегами <b> поставить тег <i> а после </b> - соответственно </i>

Полагаю, что использование регулярных выражений здесь необязательно. Можно обойтись и функцией str_replace().
Т.е.
Код
str_replace(array('<b>', '</b>'), array('<i><b>', '</b></i>'), $string)

Ну а если приспичило регулярнымы выражениями, то используй preg_replace(). Принцип тот же ...
Код
preg_replace(array('/<b>/', '/<\/b>/'), array('<i><b>', '</b></i>'), $string)


Цитата
3) В строке у каждого незакрытого а) тега <b> б) любого тега поставить в закрывающем тэге слэш "/" Например, дана строка идфоадл<b>;dsf<b>//fsd Должно получиться идфоадл<b>;dsf</b>//fsd

Код

preg_replace('/(<([a-z]+?).*?>)(.*?)<\\2>/', '\\1\\3</\\2>', 'идфоадл<b>;dsf<b>//fsd')


Если что непонятно, спрашивай!
PM   Вверх
Mal Hack
Дата 24.1.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Модератор: Название темы должно отражать ее суть!
http://forum.vingrad.ru/index.php?showtopic=55191
PM ICQ   Вверх
BIG BROTHER
Дата 24.1.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 9.12.2004
Где: Россия, Москва

Репутация: 1
Всего: 4



Цитата

Ну а если приспичило регулярнымы выражениями, то используй preg_replace(). Принцип тот же ...

ИМХО не совсем оптимальный способ использования preg_replace. Скорость упадет

Это сообщение отредактировал(а) BIG BROTHER - 24.1.2006, 18:53
--------------------
Mess with the best, die like the rest
PM MAIL ICQ   Вверх
skalex
Дата 24.1.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 0
Всего: 23



BIG BROTHER, я же сказал, что в том примере, использование регулярных выражений ни к чему.
PM   Вверх
starmaster
Дата 25.1.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 29.3.2004

Репутация: нет
Всего: нет



Нет ребята всё не то... Я прекрасно понимаю как с помощью регулярных выражений проверять есть ли в строке тот или иной шаблон... Но как работать с исключениями не совсем ясно...

1) По первому примеру: например, мы разрешаем пользователю иметь такой логин: "а_а" , но вполне логично что мы не разрешим иметь ему логин вида "___"
2) Например в каком-нибудь тексте мы захотим любой жирный текст вида "<b>something</b>" преобразовать ещё и в наклонный "<i><b>something</b></i>"
3) В тексте пользователь забывает закрыть какой-нибудь тег: "<b>something<b>", естественно это нас не устроит и мы захотим преобразовать его текст в "<b>something</b>"

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



Читал я и эту тему и тему про "задания на знание PCRE", но опять же, там довольно таки элементарные задачи, без исключений, которые есть в моих примерах...

Это сообщение отредактировал(а) starmaster - 25.1.2006, 00:32
PM MAIL WWW ICQ   Вверх
S.A.P.
Дата 25.1.2006, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Цитата(starmaster @ 25.1.2006, 00:31 Найти цитируемый пост)

1) По первому примеру: например, мы разрешаем пользователю иметь такой логин: "а_а" , но вполне логично что мы не разрешим иметь ему логин вида "___"

#^(?(?!^_+$)[a-z_]+)$#i

2) уже ответили.

3) Задача нетривиальна, одним регом не обойтись, ИМХО... Теги могут быть вложены.

Это сообщение отредактировал(а) S.A.P. - 25.1.2006, 01:21
PM MAIL   Вверх
IvanB
Дата 29.1.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Советую почитать эти статьи....
Давно выкачал....
Пригодились.

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  Regexp.rar 28,98 Kb
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
starmaster
Дата 31.1.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 29.3.2004

Репутация: нет
Всего: нет



IvanB

Да видел эту статью, читал мельком, вчера всё прочитал... Как находить в тексте шаблоны мне понятно... Но как работать с исключениями всё равно не очень понятно... Вот, к примеру, задача, в которой мы не знаем порядок следования слов: человек авторизируется, мы ему разрешаем иметь любое количество слов, но максимальное количество пробелов не должно привыжать n, - какое нибудь количество и добавлю ещё, что пробел между словами может быть только один, т.е. один \s.

Это сообщение отредактировал(а) starmaster - 31.1.2006, 01:55
PM MAIL WWW ICQ   Вверх
IvanB
Дата 31.1.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Проверить допустимость количества пробелов?
smile Если я тебя правильно понял, то надо вот так:
Код

//     Проверяемая строка
    $inputString=" asd sad sd sd ";
//     Количество пробелов
    $j=4;
    
//    $res=eregi("^([\s]?[a-zа-я0-9]+){0,".$j."}\$", $inputString);
    $dopStr=eregi_replace("[a-zа-я0-9]+","", $inputString);
// Или даже так:
//  $dopStr=eregi_replace("[^\s]+","", $inputString);
    $resStr="Проверяемая строка: <br>|".$inputString."|<br>
Допустимое количество пробелов: ".$j."<br>
Допустимость данной строки: ".(strlen($dopStr)<=$j)."<br>";
    echo $resStr;


Вопросы, которые стоят в начале темы:
1) Можно ещё так:
Код

eregi("([a-zа-я0-9_]*[a-zа-я0-9]+)|([a-zа-я0-9]*[a-zа-я0-9_]+)", $your_text);

2) Написано выше. От себя добавлю (при условии, что нет тегов, вложенных в <b></b>):
Код

$res=preg_replace("/<b>[\sa-zA-Zа-яА-Я0-9]+<\/b>/", "<i>\\0</i>", $your_text);

3) Попробуй так (при условии, что нет тегов, вложенных в <b></b>):
Код

$res=preg_replace("/<b>([\sa-zA-Zа-яА-Я0-9_,.]+)<b>/","<b>\\1</b>",$str);


Это сообщение отредактировал(а) IvanB - 1.2.2006, 09:35
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.