У меня очень страшная проблема. Не могу придумать алгоритм...
Пусть у меня есть файл:
<!-- 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()
Спустя 15 минут, 10 секунд (2.12.2011 - 17:50) alex12060 написал(а):
killer8080
У меня просто при сохранении создается пост массив, в нем элементы:
key => value
где key - ()
а value - (.*) | заменяемый текст |
Я пробегаюсь по массиву, и пользую регулярку:
Но, как и ождается, у меня в итоге остается текст из последней этерации (последнего textarea).
У меня просто при сохранении создается пост массив, в нем элементы:
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, и чего то в них вписать?
А какая хоть задача была? Выдернуть их этих кусков теги textarea, и чего то в них вписать?
Спустя 16 минут, 37 секунд (2.12.2011 - 18:52) alex12060 написал(а):
killer8080
Есть файл, в файле есть специальные теги, у меня в ТЗ так:
Вот, нужно посчитать кол-во таких тегов и вывести на редактирование содержимое (тут что угодно).
Это все сделано, но проблема появилась тогда, когда дошел до сохранения.
Файл должен быть изменен лишь в тех местах, где был изменен текст (в тегах).
Наглядный пример:
Допустим, в первом мы изменили текст с 111 на 222
и наоборот.
Должно получиться это:
Весь текст должен сохраниться, но измениться между тегов.
Есть файл, в файле есть специальные теги, у меня в ТЗ так:
<!-- 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 модификатор:
Ну дык регулярочку поправь :) Добавь /s модификатор:
...
$text = preg_replace_callback('/' . sprintf($pattern, '(.+?)', '(.+?)') . '/s', 'cb', $text);
....