Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Web-программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 08.08.2004, 11:21   [включить плавающее окно]   #1
CapOne
Мужской Умудрённый
Автор темы
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
Question Про регулярные выражения в PHP

Например, имеем
$a = "[a][b]";
Нужно заменить [ и ] на ( и )
(на самом деле задача сложнее, поэтому подойдет только ereg_replace)
Делаю так:
$a = ereg_replace("(\[)(.*)(\])", '(\\2)', $a);
В результате имею (a][b)
Потому что .* берет наибольшее совпадение.
Как сделать, чтобы бралось наименьшее совпадение?
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 08.08.2004, 14:53   [включить плавающее окно]   #2
Simon Logic
Мужской Продвинутый
 
Регистрация: 23.07.2003
Адрес: Брянск
.*?

По крайней мере на Perl'e реально работающий пример такой:

$a =~ s/(\[)(.*?)(\])/(\2)/g;

Последний раз редактировалось Simon Logic; 08.08.2004 в 15:00.
Simon Logic вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 08.08.2004, 15:53   [включить плавающее окно]   #3
CapOne
Мужской Умудрённый
Автор темы
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
Не работает. Вообще пустую строку выдает
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 09.08.2004, 00:35   [включить плавающее окно]   #4
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
CapOne либо использовать preg_replace() (он поддерживает нежадный режим), либо вместо .* написать [^\]]*
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 09.08.2004, 05:49   [включить плавающее окно]   #5
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
Думаю эту тему мона закрепить наверху.... ибо проблемы с регами бывают очень часто.... я думаю было бы удобно постить проблемы связанные с регами в отдельный топик.... и название подходящее.....
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 09.08.2004, 05:50   [включить плавающее окно]   #6
CapOne
Мужской Умудрённый
Автор темы
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
[^\]]* — До этого я уже сам догадался, но так не пойдет. Я делаю что-то вроде форумных тегов ([b ]qqq[/b ] и т. п.).
Как сделать preg_replace "нежадным"?
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 09.08.2004, 10:19   [включить плавающее окно]   #7
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
CapOne вопросом - .*?
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 09.08.2004, 10:43   [включить плавающее окно]   #8
CapOne
Мужской Умудрённый
Автор темы
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
С вопросом не работает ни ereg, ни preg (кстати, в чем разница?).

$buffer = ereg_replace('(\[url=)(.*)(\])(.*)(\[\/url\])','<a href="\\2">\\4</a>',$buffer);
работает, но жадно

$buffer = preg_replace('(\[url=)(.*)(\])(.*)(\[\/url\])','<a href="\\2">\\4</a>',$buffer);
$buffer = ereg_replace('(\[url=)(.*?)(\])(.*?)(\[\/url\])','<a href="\\2">\\4</a>',$buffer);
$buffer = preg_replace('(\[url=)(.*?)(\])(.*?)(\[\/url\])','<a href="\\2">\\4</a>',$buffer);

не работают: выдают пустую строку
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.

Последний раз редактировалось CapOne; 09.08.2004 в 10:47.
CapOne вне форума  
Ответить с цитированием
Непрочитано 09.08.2004, 11:01   [включить плавающее окно]   #9
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
для preg_replace выражение надо заключать в разделители, обычно /, т. е.
$buffer = preg_replace('/(\[url=)(.*?)(\])(.*)(\[\/url\])/','<a href="\\2">\\4</a>',$buffer);
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 09.08.2004, 14:27   [включить плавающее окно]   #10
CapOne
Мужской Умудрённый
Автор темы
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
Заработало.
Спасибо.
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 09.08.2004, 14:52   [включить плавающее окно]   #11
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
CapOne не за что
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 18.03.2005, 21:21   [включить плавающее окно]   #12
yppu
Мужской Новенький
 
Регистрация: 18.03.2005
Цитата (Johnnie Walker) »
для preg_replace выражение надо заключать в разделители, обычно /, т. е.
$buffer = preg_replace('/(\[url=)(.*?)(\])(.*)(\[\/url\])/','<a href="\\2">\\4</a>',$buffer);
Спасибо! Я тоже искал как это сделать
yppu вне форума  
Ответить с цитированием
Непрочитано 21.03.2006, 16:32   [включить плавающее окно]   #13
ewafr-bedrin
Мужской Новенький
 
Регистрация: 21.03.2006
А я бы на Perlе бы написал! Там более логично и не так запутано как в PHP! А еще говорят, что PHP для новичков и он легче в изучении! К тому же Perl на порядок быстрее работает!
ewafr-bedrin вне форума  
Ответить с цитированием
Непрочитано 27.03.2006, 14:52   [включить плавающее окно]   #14
ewafr-bedrin
Мужской Новенький
 
Регистрация: 21.03.2006
Ну вот и пиши на Perle!
ewafr-bedrin вне форума  
Ответить с цитированием
Непрочитано 17.04.2006, 11:01   [включить плавающее окно]   #15
ewafr-bedrin
Мужской Новенький
 
Регистрация: 21.03.2006
А вообще лучше забить на все и гулять с девченками!
ewafr-bedrin вне форума  
Ответить с цитированием
Непрочитано 08.05.2006, 21:58   [включить плавающее окно]   #16
Sclerosis
Мужской Продвинутый
 
Аватар для Sclerosis
 
Регистрация: 16.02.2004
в конце regmatch-строки можно поставить |U - модификатор не-жадности
Цитата
...
U (PCRE_UNGREEDY)
This modifier inverts the "greediness" of the quantifiers so that they are not greedy by default....
"(\[)(.*)(\])|U"
__________________
Как бы стремительно индустрия не развивалась, а компы тормозить будут всегда !!!
Sclerosis вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 09.05.2006, 11:00   [включить плавающее окно]   #17
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
ewafr-bedrin perl работает не быстрее.... в пхп уже давно перл-совместимые регулярные выражения....
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 28.05.2008, 23:55   [включить плавающее окно]   #18
Жуланов
Мужской Новенький
 
Регистрация: 28.05.2008
а str_repalce чем тут не подходит?
Жуланов вне форума  
Ответить с цитированием
Непрочитано 08.09.2010, 14:42   [включить плавающее окно]   #19
radar-1986
Мужской Новенький
 
Регистрация: 08.09.2010
Цитата (CapOne) »
Заработало.
Спасибо.
Зашли бы на любой seo форум, там в подробностях бы все вам растолковали
но хорошо, что и на этом форуме есть гуру php

Последний раз редактировалось radar-1986; 08.09.2010 в 14:45.
radar-1986 вне форума  
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 14:42. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey