[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Редактирование файла
alex12060
Добрый вечер форумчане!
У меня очень страшная проблема. Не могу придумать алгоритм...

Пусть у меня есть файл:


<!-- Code title="test" -->
code code code
<!-- Endcode -->

text text text text
test test test test

<!-- Code title="add_test" -->
code code code
code code code
<!-- Endcode -->


Нужно его отредактировать, точнее его текст в полях <! -- () -->(.*)<! -- () -->

где (.*) - редактируемый текст.

т.е нужно из этого:


<!-- Code title="add_test" -->
code code code
code code code
<!-- Endcode -->


сделать это:


<!-- Code title="add_test" -->
edited edited edited
<!-- Endcode -->


Я создал форму, распарсил, все готово, но не могу втыкнуть как сохранить.

У меня была тысяча идей, но все они провалились прахом.

Сейчас развиваю идею с preg_replace(), но что-то она тухло работает. Думаю щас поработать с preg_replace_callback(), но тишина в мозгу..

В общем, люди добрые, помогите! Очень надо мне это...
Можете не давать готовый код, хотя бы распишите алгоритм.

Спасибо!



Спустя 4 минуты, 15 секунд (2.12.2011 - 17:02) m4a1fox написал(а):
Алекс, разобрался?

Спустя 5 минут, 1 секунда (2.12.2011 - 17:07) alex12060 написал(а):
m4a1fox

нет.
я бы написал.

Спустя 26 минут, 18 секунд (2.12.2011 - 17:33) killer8080 написал(а):
alex12060
а в чем там проблема? Я так понял регулярку уже осилил?

Спустя 1 минута, 21 секунда (2.12.2011 - 17:35) vital написал(а):
Цитата
Я создал форму, распарсил, все готово, но не могу втыкнуть как сохранить.

file_put_contens()
wink.gif

Спустя 15 минут, 10 секунд (2.12.2011 - 17:50) alex12060 написал(а):
killer8080

У меня просто при сохранении создается пост массив, в нем элементы:

key => value

где key - ()
а value - (.*) | заменяемый текст |

Я пробегаюсь по массиву, и пользую регулярку:


$new = preg_replace($pattern, '<!-- InstanceBeginEditable name="'.$k.'" -->'.$v.'<!-- InstanceEndEditable -->', $temp);


Но, как и ождается, у меня в итоге остается текст из последней этерации (последнего textarea).

Спустя 18 минут, 43 секунды (2.12.2011 - 18:08) alex12060 написал(а):
А, все, решил. Ух...)


$e_pattern = str_ireplace('$1', $k, $e_pattern);

$new = preg_replace($e_pattern.$end_pattern, '<!-- InstanceBeginEditable name="'.$k.'" -->'.$v.'<!-- InstanceEndEditable -->', $i == 0 ? $temp : $new);

$e_pattern = str_ireplace($k, '$1', $e_pattern);

Спустя 15 минут, 51 секунда (2.12.2011 - 18:24) killer8080 написал(а):
alex12060
как то все мудрено получается, может там можно было обойтись колбэками без циклов?

Спустя 4 минуты, 22 секунды (2.12.2011 - 18:29) alex12060 написал(а):
killer8080

Мне сегодня сдавать проект)
Верю, что мудрено, но более элегантное решение пока не лезет в голову.
На досуге подумаю, если что, оставлю тут заметку.
Объясню заказчику, что доработаю если что..

Спустя 6 минут, 48 секунд (2.12.2011 - 18:35) killer8080 написал(а):
Понятно.
А какая хоть задача была? Выдернуть их этих кусков теги textarea, и чего то в них вписать?

Спустя 16 минут, 37 секунд (2.12.2011 - 18:52) alex12060 написал(а):
killer8080

Есть файл, в файле есть специальные теги, у меня в ТЗ так:


<!-- InstanceBeginEditable name="имя" -->тут что угодно<!-- InstanceEndEditable -->


Вот, нужно посчитать кол-во таких тегов и вывести на редактирование содержимое (тут что угодно).

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

Файл должен быть изменен лишь в тех местах, где был изменен текст (в тегах).

Наглядный пример:


text text text
<!-- InstanceBeginEditable name="test" -->111<!-- InstanceEndEditable -->
123456 1257 54
text text
<!-- InstanceBeginEditable name="test_1" -->222<!-- InstanceEndEditable -->
<ss>


Допустим, в первом мы изменили текст с 111 на 222
и наоборот.

Должно получиться это:


text text text
<!-- InstanceBeginEditable name="test" -->222<!-- InstanceEndEditable -->
123456 1257 54
text text
<!-- InstanceBeginEditable name="test_1" -->111<!-- InstanceEndEditable -->
<ss>


Весь текст должен сохраниться, но измениться между тегов.

Спустя 11 минут, 8 секунд (2.12.2011 - 19:03) killer8080 написал(а):
То есть нужно вывести исходный текст, а изменяемые участки завернуть в textarea, и по сабмиту изменять файл?

Спустя 10 минут, 37 секунд (2.12.2011 - 19:14) killer8080 написал(а):
типа такого
$text = file_get_contents('file.txt');
$content = '<form action="/replacer.php" method="post"><pre>'."\r\n";
$content .= preg_replace(
'#<!--\s*InstanceBeginEditable\s*name="([^"\s]+)"\s*-->(.*)<!--\s*InstanceEndEditable\s*-->#iuUs',
'<!-- InstanceBeginEditable name="$1" --><textarea name="data[$1]">$2</textarea><!-- InstanceEndEditable -->',
$text
);
$content .= '</pre><input type="submit" value="Save changes" /></form>';

Спустя 10 минут, 11 секунд (2.12.2011 - 19:24) alex12060 написал(а):
killer8080

Нет.

Вот исходный текст:


<!-- InstanceBeginEditable name="doctitle" -->
<title>Виза в Англию | Виза в Великобританию | Оплата за услуги после получения визы| Виза в Великобританию| Виза в Англию|</title>
<META
name=keywords content="виза в великобританию, виза в англию, английская виза, британская виза, получение визы в великобританию, оформление визы в великобританию, виза в британию">
<META
content="Оформление визы в Великобританию. Оплата после получения визы. Вся информация по визам." name="description">
<!-- InstanceEndEditable -->

<!-- InstanceBeginEditable name="title" -->

Виза в Англию | Виза в Великобританию | Оплата за услуги после получения визы| Виза в Великобританию| Виза в Англию|
<!-- InstanceEndEditable -->


Исходный текст, который получается после парсинга:


<div class="content">


<form
action="cmd.php?save" method="post">
<p
style="width: 700px; float: left"><label style="float: left; width: 150px">Форма "<b>doctitle</b>":</label> <textarea style="float: left; width: 550px; height: 200px" name="doctitle">
<title>
Виза в Англию | Виза в Великобританию | Оплата за услуги после получения визы| Виза в Великобританию| Виза в Англию|</title>
<META
name=keywords content="виза в великобританию, виза в англию, английская виза, британская виза, получение визы в великобританию, оформление визы в великобританию, виза в британию">
<META
content="Оформление визы в Великобританию. Оплата после получения визы. Вся информация по визам." name="description">
</textarea></p>
<p
style="width: 700px; float: left"><label style="float: left; width: 150px">Форма "<b>title</b>":</label> <textarea style="float: left; width: 550px; height: 200px" name="title">
Виза в Англию | Виза в Великобританию | Оплата за услуги после получения визы| Виза в Великобританию| Виза в Англию|
</textarea></p>
<p
style="width: 700px"><input type="submit" name="s" value="Отправить" /></p>
<input
type="hidden" name="path" value="/editor/e/test.txt" />
</form>
</div>



После нажатия отправляем измененный текст, и в итоге, текст, измененный в текстареа должен поменяться в исходном файле.

Спустя 19 секунд (2.12.2011 - 19:24) kirik написал(а):
Это требовалось?
header('Content-type: text/plain; charset=utf-8');
error_reporting(E_ALL);

$text = '
text text text
<!-- InstanceBeginEditable name="test" -->111<!-- InstanceEndEditable -->
123456 1257 54
text text
<!-- InstanceBeginEditable name="test_1" -->222<!-- InstanceEndEditable -->
<ss>
'
;

$pattern = '<!-- InstanceBeginEditable name="%s" -->%s<!-- InstanceEndEditable -->';


$change = array();
// Меняем значения
$change['test'] = 222;
$change['test_1'] = 111;


function cb($m) {
global $pattern, $change;
return isset($change[$m[1]]) ? sprintf($pattern, $m[1], $change[$m[1]]) : $m[0];
}

$text = preg_replace_callback('/' . sprintf($pattern, '(.+?)', '(.+?)') . '/', 'cb', $text);

echo $text;

Спустя 35 минут, 9 секунд (2.12.2011 - 19:59) alex12060 написал(а):
kirik

Ну да, но не сработало в моем тесте:

Свернутый текст


$text = '
<!-- InstanceBeginEditable name="ololol1" -->
FACE PAAALM!!!!
----------------
PATH /EDITOR/E/!!
----------------
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
<!-- InstanceEndEditable -->

test

<!-- InstanceBeginEditable name="ololol2" -->
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
<!-- InstanceEndEditable -->

testt

<!-- InstanceBeginEditable name="ololol3" -->
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
<!-- InstanceEndEditable -->

testtt

<!-- InstanceBeginEditable name="ololol4" -->
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
<!-- InstanceEndEditable -->

testeeee

<!-- InstanceBeginEditable name="ololol5" -->
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
FACE PAAALM!!!!
<!-- InstanceEndEditable -->
eeee
'
;

$change = array(
'ololol1' => '111',
'ololol2' => '222',
'ololol3' => '333',
'ololol4' => '444',
'ololol5' => '555',
);


$pattern = '<!-- InstanceBeginEditable name="%s" -->%s<!-- InstanceEndEditable -->';


function cb($m) {
global $pattern, $change;
return isset($change[$m[1]]) ? sprintf($pattern, $m[1], $change[$m[1]]) : $m[0];
}

$text = preg_replace_callback('/' . sprintf($pattern, '(.+?)', '(.+?)') . '/', 'cb', $text);

echo $text;



Ожидается результат:

Свернутый текст

<!-- InstanceBeginEditable name="ololol1" -->
111
<!-- InstanceEndEditable -->

test

<!-- InstanceBeginEditable name="ololol2" -->
222
<!-- InstanceEndEditable -->

testt

<!-- InstanceBeginEditable name="ololol3" -->
333
<!-- InstanceEndEditable -->

testtt

<!-- InstanceBeginEditable name="ololol4" -->
444
<!-- InstanceEndEditable -->

testeeee

<!-- InstanceBeginEditable name="ololol5" -->
555
<!-- InstanceEndEditable -->
eeee


З.Ы. Текст писал давно, и, никак никкому из участников не относится)

Спустя 2 часа, 11 минут, 51 секунда (2.12.2011 - 22:11) kirik написал(а):
alex12060
Ну дык регулярочку поправь :) Добавь /s модификатор:
...
$text = preg_replace_callback('/' . sprintf($pattern, '(.+?)', '(.+?)') . '/s', 'cb', $text);
....
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.