Помогите с регулярным выражением

tche

Новичок
Помогите с регулярным выражением

Народ, помогите, необходимо строку
"'Interpolation' with estimates in #cbig##pp#"

переделать в
"'Interpolation' with estimates in
"

то есть заменить все пары #XXX# на
, не трогая выражения типа �

$text=preg_replace("!([#])(.*?)([#])!si","
",$text);

пришибает все парные #, как сюда вписать условие, чтобы он пропускал �

Заранее благодарен,
Дима
 

Demiurg

Guest
"!#(.*)#!Usi"

ps объясните мне, где вы берете конструкцию ".*?" ?
 

tche

Новичок
блин, все перекорежилось

'Interpolation' with estimates in
#cbig##pp#

'Interpolation' with estimates in
[IMG]cbig[/IMG][IMG]pp[/IMG]


$text=preg_replace("!([#])(.*?)([#])!si","[IMG]\\2[/IMG]",$title);
[/PHP]
 

tche

Новичок
Автор оригинала: Demiurg
"!#(.*)#!Usi"

ps объясните мне, где вы берете конструкцию ".*?" ?
нашел в одном из примеров и в описании оно тоже есть, работает.

U здесть, вроде, не помогает
 

Demiurg

Guest
>нашел в одном из примеров и в описании оно тоже есть, работает
ссылку, пожалуйста.
 

Demiurg

Guest
А без "вроде" ?
$text = "'Interpolation' with estimates in #cbig##pp#";
$text=preg_replace("!#(.*)#!Usi","[ img ]\\1[/ IMG]",$text);

echo $text;
 

Linker

Guest
Автор оригинала: Demiurg
"!#(.*)#!Usi"

ps объясните мне, где вы берете конструкцию ".*?" ?
Это похоже не Perl-совместимый квантификатор:
в разделе про "U"

Он вроде ограничивает "жадность" локально, тогда как U действует на весь паттерн.
 

Yukko

Новичок
Demiurg
Может я объясню, потому что я понимаю, что это такое и пользуюсь, когда надо.

Например, текст между тегами <b></b>, там может все что угодно. Если мы напишем <b>(.?)</b> и выведем сохраненный результат, то в такой строке:
<b>здесь может быть все что угодно и другие теги тоже</b>
то сохраненный скобками результат будет содержать текст
здесь может быть все что угодно и другие теги тоже

если же ты предложишь этому выражению вот такую строку:
<b>текст в котром</b> есть <b>несколько тегов, которые делают текст жирным</b>

то конструкция из-за жадности квантификаторов сохранит:
текст в котром</b> есть <b>несколько тегов, которые делают текст жирным, что нежелательно!

Я же напишу по-другому:
<b>(.*?)</b> несколько неэффективное решения для механизма РВ, но если не дано других условий поиска, то тогда и это решение катит. Что оно делает, сначала оно сохраняет текст, как в предыдущем примере, от первого открывающегося тега <b> до последнего закрывающегося тега </b> но в конце конструкции .* (сколько угодно чего угодно), стоит квантифакатор ? который говорит, сколько угодно чего угодно, но не больше чем один раз. Он призван в этом примере умерить жадность квантификатора * и откатывает поисковый механизм до первого найденного закрывающегося тега </b>. Таким образом будет найдено отдельно
<b>текст в котром</b>
и отдельно
<b>несколько тегов, которые делают текст жирным</b>
Избавившись от жадности мы получили нужный эффект.
 

Demiurg

Guest
Вообщем похоже на костыли.

> но если не дано других условий поиска, то тогда и это решение катит.
вот здесь можно примерчик ?
 

Demiurg

Guest
Плохой примерчик. Регулярные выражения здесь вообще не нужны :)
 

Yukko

Новичок
Вообщем похоже на костыли.
иногда это и есть костыли. я же не думаю, что за один заход выдаешь что-то типа такого:
"/'[a-zA-Z0-9 ]+(')(?:[a-zA-Z0-9 *]?')*[a-zA-Z0-9 ]+'(?=[a-zA-Z0-9 ]+=| *$)

а такая подстановка поставленная в некоторых местах просто позволяет на этапе продумывания всей структуры и требований к РВ не задумываться про наполнение классов и условия выбора и т.д.
 

Demiurg

Guest
То есть не задумываясь о последствиях лепим как попало, лиш бы сейчас работало ?
 

Yukko

Новичок
Demiurg
почему? читай:
на этапе продумывания всей структуры и требований к РВ
Demiurg
зачем мыслишь так узко? я понимаю, что ИМЕННО ЭТОТ ПРИМЕР с точкой без РВ сделать можно, я тебе сходу привел случай, в котором эта конструкция может использоваться... возьми и попробуй задать условие, в котором надо найти весь текст от какой-то группы символов, до другой группы символов:
[0-9]{2}.*?[abz1]{2,3} причем варианты с двумя цифрами вначале и с текстом, который состоит из abz1, который по длинне не меньше двух и не больше трех встречается несколько раз...
 

Demiurg

Guest
НЕ подумай, что я придераюсь, просто я хочу понять зачем хватать грабли, когда можно подставить один модификатор и не мучатся ...
 

Yukko

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

Я все это отлично понимаю, поэтому стараюсь не применять эту конструкцию:
а. к большому тексту
б. если есть возможно описать по-другому
 

Demiurg

Guest
Да я знаю примерно механизмы работы РВ, поэтому и возмущаюсь по поводу вот таких конструкций.
 

Yukko

Новичок
Demiurg
:)
вот пример:
с тем же текстом между тегами <b></b> тебе надо либо писать сложные условия поиска, которые ограничивают поиск только внутри тегов, либо просто отделаться минимльным квантификатором. Все зависит от контекста, если я скормлю такому РВ много текста, то кто-то может и загнуться :) (веб-сервер), а если мне нужно что-то сделать в трех строчках, то почему бы и нет... чем писать на языке РВ двутомник Война и мир.

Но опять же с тем же текстом между тегами <b></b> например, мне надо найти в такой строке
<b>bla bla<b>bla2 bla2</b>
РВ <b>.*?</b>пройдет мимо второго <b> даже неподумав, потому что условие окончания поиска — нахождение закрывающегося тега </b> и теперь тут мы должны знать свой контекст.
Если нам надо находить любой текст от первого <b> до первого </b> и пусть внутри будет что угодно и даже еще один <b> то такое решение вполне приемлимо, но если нам как раз это не нужно, то прийдется переделывать РВ полностью. Те кто впервые увидел .*? сначала думают, что это панацея и используют не задумываясь... я уже из этого периода вышел :D
 

Yukko

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