php. и регулярные выражения.

Phoenix

Есть шаблон, в котором имеются выражения вида ##lalala##
есть функция, которая читает что-то из бд и заменяет ##lalala## на какие-то данные.
написано так:

$pattern[] = '/##lalalala1##/';
$subs[] = '1';

$pattern[] = '/##lalalala2##/';
$subs[] = 'pampam2';

$pattern[] = '/##[^#]*##/';
$subs[] = 'undef';
preg_replace($pattern,$subs,$template)


проблема1: Я не которолирую то, что будет в $subs, а значит там может появится ##lalalala1##.
проблема2: хочется использовать шаблоны в разных местах и неиспользуемые ##lalala## заменить на что-нибудь вроде пустой строки или undef.
в манах про php нигде не сказано, как ведёт себя функция и в каком порядке происходит замена.
в общем, что делать?
ps^
 

$pattern = array('/##pat1##/', '/##pat2##/','/##[^#]*##/');

$repl = array('fdsfda##pat2###fdsafdasf','BB##fdfadasfd###','==UNDEF==');

$str = '##pat1## ##pat2## ##pat3##';

$str2 = preg_replace($pattern,$repl,$str);

print $str2;

[b]вывод[/b]
fdsfdaBB==UNDEF====UNDEF==fdfadasfd#==UNDEF==pat3##

код вернул
т.е. совсем не то, что хочется увидеть.
т.е. произошла замена по первому шаблону и поиск след. шаблона начался с того, что вставили

sbs-66

Он сначала полностью производит поиск и замену по первому шаблону, потом по второму, и т.д.

sbs-66

Тебе надо дедать так:
 
preg_replace_calback('/##(lalalala1|lalalala2|[^#]+)##/', $str, 'myfunc');

function myfunc( &$m )
{
switch( $m[1] ) {
case 'lalala1': return ...;
case 'lalala2': return ...;
default: return 'undef';
}
}

Phoenix

ок. спасибо.
как раз наткнулся на эту функцию

Phoenix

хочу поделиться ценным наблюдением по поводу этой функции.
идея взята с http://forum.vingrad.ru/forum/topic-154537.html
если кто знает, как передать фукнцию класса как аргумент, буду рад узнать.
сейчас работает в достаточно извращённой форме.


function callfunc(&$obj,$func,$m) {
return $obj->{$func}($m);
}


class ccc {
function aaa {
global $c;
$c = $this;
preg_replace_calback('/##([^#]+)#(#)/',
create_function('$mathes','global $c; return callfunc(&$c,"myfunc",$mathes);'
$template);

}

function myfunc( &$m )
{
switch( $m[1] ) {
case 'lalala1': return ...;
case 'lalala2': return ...;
default: return 'undef';
}
}


}

artimon

если кто знает, как передать фукнцию класса как аргумент, буду рад узнать.
http://ru2.php.net/manual/en/language.pseudo-types.php#langu...

Phoenix

я так пробовал. :grin:
почему-то не заработало - возможно потому, что внутри класса вызывал.
а потом вообще, захотелось ещё аргументов передать

sbs-66

preg_replace_calback('/##([^#]+)#(#)/', $template,
array( &$this, 'myfunc' ) );

kruzer25

если кто знает, как передать фукнцию класса как аргумент, буду рад узнать.
А по-человечески в пхп это сделать вообще нельзя. Потому что пхп - говноязык, в котором не хватает огромной кучи приятных вещей.
Если ты только начал, советую перейти на что-нибудь нормальное, вроде java/.net.

pitrik2

вроде java
и как же в java передать функцию класса как аргумент?

kruzer25

Я предполагаю, что в Java функции/методы/код являются нормальными объектами, в отличие от пхп, где они являются строками/массивами/большими строками (и где тебе предстоит ебля с неработающим автодополнением).
В C# это, судя по слухам, точно есть.

pitrik2

Я предполагаю, что в Java функции/методы являются нормальными объектами.
В C# это, судя по слухам, точно есть.
фигово предполагаешь
в сишарп это тоже не объекты, хотя их хитро передать вроде можно, но точно не объекты

kruzer25

Ну вот то, что в википедии называется delegates - разве не оно?
А вообще, я уже много раз сталкивался с тем, что возникает какая-то идея, концепция языка, которая здорово облегчила бы жизнь, и в пхп её нет - а потом через некоторое время оказывается, что в c# это давно есть, пока что ещё ни разу не было такого, чтобы какая-то такая придуманная концепция отсутствовала в c#

pitrik2

пока что ещё ни разу не было такого, чтобы какая-то такая придуманная концепция отсутствовала в c#
имеется ввиду придуманная тобой?
просто большинство фишек сишарпа взято с лиспа, но не все
потому полно концепций которых в сишарпе нет

pitrik2

delegates - разве не оно
оно, я с тобой не спорил
я лишь сказал что в джаве такого нет и что делегаты это не объекты

kruzer25

имеется ввиду придуманная тобой?
Да.
просто большинство фишек сишарпа взято с лиспа, но не все
А мне казалось, что сишарп вначале был почти полной копией джавы, разве не так?

kruzer25

я лишь сказал что в джаве такого нет
Что, серьёзно? :o
и что делегаты это не объекты
Это вопрос терминологии.

pitrik2

А мне казалось, что сишарп вначале был почти полной копией джавы, разве не так?
и?
где противоречие?

kruzer25

Ну как бы где джава - и где лисп?

pitrik2

не понимаю твого вопроса
что значит где?
джава - один из самых простейших языков
сишарп - довольно мощный
лисп - самый мощный

kruzer25

Круг задач, которые можно сделать на каком-то языке - одинаков для всех этих трёх языков.
Джава и сишарп очень похожи, отличаются только какими-то фичами (некоторые фичи есть только в джаве, некоторые - только в сишарпе).
Лисп - что-то совершенно другое.
Некоторые задачи легче (удобнее) делать на джаве/сишарпе, некоторые - на лиспе.
Что означает твоё утверждение "лисп - самый мощный"?

pitrik2

Что означает твоё утверждение "лисп - самый мощный"?
в рамках данного треда - там больше фич чем в джаве/сишарпе
собсна выражение что лисп самый мощный пошло с этой статьи: http://www.nestor.minsk.by/sr/2003/07/30710.html
джава по сравнению с сишарпом по количеству фич - отстой :(
собсна я токо две навскидку знаю фичи которые есть в джаве и нет в сишарпе, а вот наоборот - дофига
1) енамы - полноценные объекты
2) анонимные классы
джава очень консервативный язык, там токо в последнее время начали фичи добавлять, и то неспеша
сишарп же очень прогрессивный в этом плане, с каждой новой версией языка добавляется дофига всего

sbs-66

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

kruzer25

но вот эти ваши рюшечки из лиспа в вебе точно нахуй не нужны.
Я понятия не имею, какие там рюшечки в лиспе. Но ты, видимо, никогда не делал на пхп сложные большие проекты. В пхп этих фич не хватает настолько, что, когда что-то делаешь - сам придумываешь эти фишки, и понимаешь, насколько они облегчили бы жизнь. Например, позднее статическое связывание (ну это уже не фича других языков, а баг пхп неймспейсы, делегаты, аспекты, try...catch...finally итд.
Кстати, ты на чём пишешь, на пхп4 или на пхп5? В пхп4 ведь тоже есть ООП!
Да, кстати - а что значит "в вебе"?

sbs-66

позднее статическое связывание в PHP уже есть. Неймспейсы тоже вроде есть, хотя я и не знаю, зачем они нужны. Нахрена нужны делегаты и аспекты я не понимаю.
Сам я пишу на С++, просто время от времени делаю какие-то вещи на PHP для себя или для других.

mkrec

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

sbs-66

Зачем нужны неймспейсы вообще я понимаю. Хотя их вполне заменяют классы, но иногда удобно пользоваться именно неймспейсами. А вот зачем они нужны на веб-сайтах мне не понятно. Вряд ли у вас там будет великое множество подсистем, для каждого из которых необходимо своё пространство имён.

kruzer25

А вот зачем они нужны на веб-сайтах мне не понятно
Что такое "веб-сайт"?
Чем "веб-сайт" отличается от обычного приложения?

kruzer25

Нахрена нужны делегаты и аспекты я не понимаю.
Делегаты - чтобы не ебаться с их неполноценной реализацией в пхп.
Аспекты - чтобы не засирать код подобным говном:
function doSomething {
 try {
  RegistryCleaner::getInstance->watch;
  DB::BeginTrans;
  try {
   //...do something...
   $res = ...something...
  } catch(Exception $e) {
   throw new SomethingException($e);
  }
  DB::CommitTrans;
  RegistryCleaner::getInstance->clean;
 } catch(SomethingException $e) {
  DB::RollbackTrans;
  RegistryCleaner::getInstance->clean;
 }
 return $res;
}

в сотне экземпляров, когда всё могло бы уложиться в
@TransactionalCleanable function doSomething {
//...do something...
return ...something...
}

Сам я пишу на С++,
О, ну по сравнению с с++ пхп, конечно, рулит. А по сравнению с ассемблером пхп так вообще мегаудобный язык.

sbs-66

О, ну по сравнению с с++ пхп, конечно, рулит. А по сравнению с ассемблером пхп так вообще мегаудобный язык.
Нет, по сравнению с C++ PHP сосёт. Однако для веба PHP хорош. У него есть свои минусы (отсутсвие нативной поддержки юникода; геморой с реализацией отдельных функций на других языках; невозможность "ручного управления", когда это нужно (например с аплоадом файлов); сравнительно низкое быстродействие но отсутсвие навороченной поддержки ООП и сопутсвующего синтаксического сахара не из их числа. Мне ещё некоторые вещи в PHP не нравятся, и я, наверное, перейду на Python, но это к делу не относится.
Вообще мне кажется, что ты чрезчур сложно и обобщённо подходишь к задачам, которые встречаются в веб-проектах. Ну, т.е. городишь этакие всемогутеры, из-за чего тебе нужны какие-то очень хитрые штуки или приходится делать через задницу. Я, конечно, твой код не видел, так что могу и ошибаться. Просто мой опыт говорит мне, что вещи, которые необходимы при написании серьёзных десктопных приложений, совсем не нужны при написаний веб-проектов, так как там всё гораздо прямолинейнее, плюс мы полностью контролируем среду, в которой выполняется код. Серьёзный программинг начинается в вебе при масштабировании, когда приложение работает на нескольких серверах, есть несколько серверов баз данных и т.д.

bansek

Я что-то пропустил? В джаве, как и в любом языке, где есть rt это делается на раз-два 0_о
Вот в пхп, это сделано, через задницу, т.к. концепция классов/объектов там довольно убогая и высосана из пальца, но тоже делается =)

Dasar

Я что-то пропустил? В джаве, как и в любом языке, где есть rt это делается на раз-два 0_о
как хак сойдет, на нормальное поддерживаемое решение - не тянет.

bansek

Ну, номаным решением для такой задачи было бы создание правильного интерфейса и его использование (во всяком случае в джаве). С шарпе - делегаты, как тут из зала предлагали =)
Оставить комментарий
Имя или ник:
Комментарий: