Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.07.2009, 11:08
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

Вырезать регуляркой
Помогите написать регулярку. Нужно вырезать из переменной $text все значения ширины типа ' width="ЧЮБОЕ_ЗНАЧЕНИЕ"'. Как я понимаю регуляркой это возможно?
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2009, 11:29
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

alert(
('dsfsdfds width="ЧЮБОЕ_ЗНАЧЕНИЕ" dsfsd width="5px"fds'
	.match(/ width="[^"]*"/g) || []).join('\n')

);
Ответить с цитированием
  #3 (permalink)  
Старый 20.07.2009, 11:58
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

Riim,
Спасибо большое! Только мне надо было для PHP. Я модифицировал вот так:
$text = preg_replace("' width=\".*?\"'si", '',$text);

вроде тоже правильно?
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2009, 12:16
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от greatilya
.*?
Регулярки с отключением жадности иногда очень тормозят. Лучше по возможности избегать его. В PHP не тестировал, но если задуматься над тем как такая отключенная жадность обрабатывается, то это должно быть верно для всех языков.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2009, 12:58
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

Сообщение от Riim
Регулярки с отключением жадности иногда очень тормозят
да это для меня не важно, я для парсинга на локальной машине пишу. Так что ресурсов хватает, тем более что текста не много.
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием
  #6 (permalink)  
Старый 21.07.2009, 13:26
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Сообщение от Riim Посмотреть сообщение
Регулярки с отключением жадности иногда очень тормозят.
А можно узнать, почему именно, и чем же так отличается поведение "нежадного" квантификатора?
Ответить с цитированием
  #7 (permalink)  
Старый 21.07.2009, 16:24
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от e1f
А можно узнать, почему именно, и чем же так отличается поведение "нежадного" квантификатора?
я думаю, что дело в том, что для нежадного квантификатора нужно после каждого символа проверять оставшуюся часть шаблона, для жадного это по логике должно произойти один раз, когда найдено наиболее жадное соответствие. Хотя при этом оставшаяся часть шаблона может не подойти и надо будет возвращаться (по аналогии с нежадным)

для более сложных задач можно парсить html, для этого есть следующие вещи: http://ua.php.net/manual/en/book.dom.php , http://blog.fedecarg.com/2008/08/07/...-jquery-style/ , или можно просто погуглить на тему "html parser php"

p.s. а зачем понадобилось из строки вырезать ширину? Откуда эта строка берется?
Ответить с цитированием
  #8 (permalink)  
Старый 21.07.2009, 16:52
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
нужно после каждого символа проверять оставшуюся часть шаблона, для жадного это по логике должно произойти один раз, когда найдено наиболее жадное соответствие.
Все верно, при этом если оставшаяся часть шаблона достаточно большая, то регулярка может стать совсем уж тормозной, ведь она будет примеряться столько раз сколько символов в тексте.
Ответить с цитированием
  #9 (permalink)  
Старый 22.07.2009, 13:05
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Riim,
И все же я не понял принципиальной разницы Если квантификатор "жадный", то движок начинает "набирать" на него совпадение, набирает-набирает, пока не упрется, потом идет дальше. Если в процессе он видит, что совпадение невозможно в таком варианте, он "отпускает" один символ от жадного кв-ра и снова топает по проторенному пути.
Если квантификатор "нежадный", то движок хватает первое попавшееся совпадение и радостный топает дальше. Если не может найти совпадение -- возвращается, пробует добавить символ, и потом топать дальше.
Где принципиальная разница?
Ответить с цитированием
  #10 (permalink)  
Старый 23.07.2009, 19:59
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от e1f
Если квантификатор "нежадный", то движок хватает первое попавшееся совпадение и радостный топает дальше
А как ему определить, сколько символов в этом первом попавшемся совпадении?

Вот такая строка: '0123456789012345678901234567890123456789012345678 9012345678901234567890123456789mail@mail.ru'

С жадностью: /[^a-z]*[^0-9]+/

Здесь что бы регулярке сдвинуться на один символ вправо нужно сделать всего одно действие: примерить этот символ к [^a-z]

Без жадности: /[^a-z]*?[^0-9]+/

Что бы сдвинуться на один символ вправо нужно сначала примерить символ к [^0-9] и если не подходит, то тогда уже примерять к [^a-z]. Т. е. два действия. Пока тормозит всего в 2 раза сильней, и теперь заменяем в обоих случаях [^0-9]+ на что-нибудь посложней, вроде того:
RegExp.eMail = '[0-9a-z][.\\-\\w]{20}@(?:[0-9a-z][\\-0-9a-z]*[0-9a-z]\\.)+[a-z]{2,6}';

Регулярка с жадностью сначала вберет в себя все цифры и далее !один! раз примерит RegExp.eMail к 'mail@mail.ru' .
Регулярка без жадности будет примерять RegExp.eMail много-много раз и это примирение уже довольно тяжелое.

зы: если кто-нибудь попросит объяснить сначала, то мне придется сделать себе харакири.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вырезать часть хтмл Alexxx Общие вопросы Javascript 2 20.06.2009 05:23
Имя файла регуляркой greatilya Общие вопросы Javascript 2 05.03.2009 12:04
Помогите с регуляркой... alexKniaz AJAX и COMET 0 03.11.2008 01:16