Что лучше использовать regexp или strpos?

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Tammaco
Вы это с лёгкостью можете прочитать в мануале.
 

Tammaco

Новичок
Спасибо, мануал всё объяснил.
Но вот теперь другой вопрос, ведь в preg_replace нельзя указать на подмаску шаблона(тела функции) и закодировать её. Так же нельзя вытащить имя функции(что тоже нужно),ведь так?или есть вариант замены на только что найденный код?

-~{}~ 05.10.07 17:12:

вроде бы ответ нашёлся...

function decode_func($matches)
{
return '<function name="'.$matches[3].'">'.
base64_decode($matches[2]).'</function>';
}

echo preg_replace_callback('~
<script.*>
(.*)
(function\s+([\w]+)\([^\)]*\)\s+{.*})
(.*)
</script>
~xUis', 'decode_func', $html);

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

-~{}~ 05.10.07 17:28:

странно...если убрать квантифактор U ,то как раз берётся последняя скобка.
Всё-таки немного непонятно, что такое "...инвертировать жадность квантификаторов..."?
 

Tammaco

Новичок
Тогда без жадности не обойтись.
И снова проблема в последней скобке, а точнее в том, как сделать так, чтобы $matches[2] было всё тело функции?
 

dimagolov

Новичок
Tammaco, а ф-ии могут быть еще в JS вложены друг в друга (что не означает что у них вложенная область видимости) и декларироваться по крайней мере минимум 4 разными по синтакситу методами не считая eval. Может не стоит начинать писать интерпритатор JS на PHP? Какой вообще смысл во всей этой активности?
 

andymc

Новичок
Tammaco
Единственное, что получилось - закодировать все функции в коде с помощью рекурсивного паттерна
PHP:
echo preg_replace('~
{
	(((?>[^{}]+)|(?R))*)
}
	~xise', '"{".base64_encode("$1")."}"', $html);
 

Tammaco

Новичок
andymc,
огромное спасибо, вы мне очень помогли.

А на счёт вложенных функций - придётся кодировать только внешнюю.
 

Tammaco

Новичок
kruglov
Дело в том, что при постановке задачи мной был задан вопрос например о скриптах, в которых вообще нет функций, а есть только java-script. В итоге было решено кодировать только скрипты вида
<script...>
function name(a,b)
{
...
}
</script>
что собственно вполне осуществимо приведёнными способами.
 

dimagolov

Новичок
Автор оригинала: Tammaco
kruglov
Дело в том, что при постановке задачи мной был задан вопрос например о скриптах, в которых вообще нет функций, а есть только java-script. В итоге было решено кодировать только скрипты вида
<script...>
function name(a,b)
{
...
}
</script>

что собственно вполне осуществимо приведёнными способами.
Вы сами себе противоречите.
Причем то, что вы указали в примере - это декларация ф-ии, которая никак не выполняется. Что в корне отличается от скриптах, в которых вообще нет функций, так как там каждая строка - выражение, исполняемое интерпретатором в момент обработки.
 

Tammaco

Новичок
dimagolov,
Попробую объяснить яснее.
Мне нужно закодировать только скрипты вида
<script...>
function name(a,b)
{
...
}
</script>
Другие(в том числе и где нет функции) просто игнорируются и остаются в первоначальном виде.
 

dimagolov

Новичок
Tammaco
а если там будет так:
Код:
name2 = function(a,b) {
...
};
window.prototype = {
name3 : function(a,b) {
...
}
};
window.prototype.name4 = function(a,b) {
...
};
name5 = new Function ("a,b","...");
то объявленные таким образом ф-ии ничем не будут отличаться от объявления, что вы указываете, но почему-то по Вашей логике должны игнорироваться.
Если бы Вы расказали зачем все это надо было бы понятно как решать задачу в целом, а не беспредметно обсуждать регулярку
 
Сверху