Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Записать в файл.
 
 автор: dream-x   (10.08.2008 в 21:08)   письмо автору
 
 

Здравствуйте! Вот у меня есть код:
<?php
$content = file_get_contents("description.htm");
$search  = "|<td>([0-9]{1,})</td>|ism";
$fp = fopen("keys.txt","w+");

for($i = 0; true; $i++)
{
    preg_match_all($search, $content, $match, PREG_PATTERN_ORDER);
    $key = $match[1][$i];
    echo "<td>".$key."</td><br/>";
    $key = $key*3;
    $key = round($key);
    fputs($fp,"<td>".$key."</td>\n");
    flush();
    if(empty($key))break;
}
fclose($fp);
?>

Он все делает как мне нужно, но я хочу его усовершенствовать чтобы он сохранял результат полученного не в сторонний файл а в тот же откуда я его и взял. Я так понимаю:
1. Я нахожу выражение которое мне надо
2. Выдираю его и выолняю с ним действия
3. И теперь записываю его в тоже месть (и тут я понять не могу как это сделать?)
Т. е. мне надо чтобы курсор находился в томже месте? или через функцию preg_replace?

  Ответить  
 
 автор: Николай2357   (10.08.2008 в 23:49)   письмо автору
 
   для: dream-x   (10.08.2008 в 21:08)
 

Я чтото похожее делал, но по моему (по моему) курсор поставить можно только в конец, или начало файла. Можно прочитать его в переменную, найти нужное место и перезаписать.

  Ответить  
 
 автор: dream-x   (11.08.2008 в 00:28)   письмо автору
 
   для: Николай2357   (10.08.2008 в 23:49)
 

А ты не помнишь какими функциями пользовался а то я новичок и совсем мало знаю.

  Ответить  
 
 автор: Николай2357   (11.08.2008 в 00:35)   письмо автору
 
   для: dream-x   (11.08.2008 в 00:28)
 

Там как минимум метки ставить надо, по регуляркам трудно делить. Если файлы все Ваши, то разметьте чем нибудь, комментами например, чтоб не видно было, а потом explode() можно, и вставлять, что нужно. Если непонятно написал, могу подробнее...

  Ответить  
 
 автор: dream-x   (11.08.2008 в 01:15)   письмо автору
 
   для: Николай2357   (11.08.2008 в 00:35)
 

Подробнее можно? Я просто пытаюсь щас через регулярные написать но никак :-(

  Ответить  
 
 автор: Николай2357   (11.08.2008 в 06:57)   письмо автору
 
   для: dream-x   (11.08.2008 в 01:15)
 

Вот только я же не знаю, какой файл у Вас. Ну, допустим, так:
<html>
<body>
<div>
<!--Метка-->
Текст, который нужно изменять
<!--Метка-->
</div>
</body>
</html>

<?
$text
=file_get_contents("description.htm");
$text=explode("<!--Метка-->",$text);//Получается массив из частей файла. 
//Теперь нужную часть меняем и собираем все обратно:
$text=$text[0]."<!--Метка-->".$newtext."<!--Метка-->".$text[2];
$fp=fopen("description.htm","w+");
flock ($fp,LOCK_EX);
fputs($fp,"$text");
flock ($fp,LOCK_UN);
fclose($fp);

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

  Ответить  
 
 автор: BinLaden   (11.08.2008 в 18:46)   письмо автору
 
   для: Николай2357   (10.08.2008 в 23:49)
 

В любое место можно ставить. Для этого есть fseek().

  Ответить  
 
 автор: xx77   (11.08.2008 в 10:23)   письмо автору
 
   для: dream-x   (10.08.2008 в 21:08)
 

непонятно как должен скрипт сохранять в тот-же файл.

просто находить и заменять похоже на это:
<?
# на всякий случай пробуйте на копии файла
# и учитывайте что повторный вызов скрипта умножит всё на 3 повторно
$content file_get_contents("desc.htm"); 
$search  "|<td>(\d+)</td>|ie"
$replace '"<td>" . round($1 * 3) . "</td>"';
$content preg_replace($search$replace$content);
# хотя непонятно зачем round() если [0-9]{1,} * 3
file_put_contents("desc.htm"$content);
// и непонятно зачем были нужны модификаторы ms
?>

, или просто записать в файл одни только найденные значения.


Вариант с манипуляциями курсором не очень удобный,
т.к. длинна изменённых строк будет отличатьс от длинны перезаписываемых .
И записываемые подстроки будут накладываться на текст следующий после найденных
<?
$fp 
fopen('desc.htm''r+'); 

fseek($fp9); #устновить курсор перед байтом 9
fputs($fp'777777777777');  # перезапись 12и байт, не больше не меньше
fseek($fp0); # на начало
$txt fread($fp1024);
print 
$txt;
fclose($fp); 

  Ответить  
 
 автор: dream-x   (12.08.2008 в 01:17)   письмо автору
 
   для: xx77   (11.08.2008 в 10:23)
 

Здравствуюте xx77. Я вот не понял ваш метод т.к. мне надо найти число потом его перемножить и потом записать на это же место. Вот пример файлаЖ

<td>45</td>
<td>5</td>
<td>145</td>
<td>44</td>

  Ответить  
 
 автор: xx77   (12.08.2008 в 09:40)   письмо автору
 
   для: dream-x   (12.08.2008 в 01:17)
 

Здравствуйте тоже ,)

собс-но нет никакого метода.

весь файл считывается в строку ,
выполняется преобразование её с помощью preg_replace(),
и строкой перезаписывается тот-же файл.
(но для отладки удобнее перезаписывать другой файл)

preg_replace работает примерно так:
<pre><?php

$content 
'
<td>45</td> 
<td>5</td> 
<td>145</td> 
<td>44</td>'
;  

$search  "|<td>(\d+)</td>|e";  
$replace '"<td>" . ($1 * 3) . "</td>"'
$content preg_replace($search$replace$content); 

print 
htmlspecialchars($content);

?></pre>

посредством применения модификатора e строка замены интерпретируется как код php.
Если например нужно было-бы оперировать строкой из $1, в которой могли-бы быть символы $ и буквы ,
целесообразнее было-бы записать $replace как например '"<th>" . функция(\'$1\' , 3) . "</th>"';
что-бы не возникали попытки их интерпретировать.

с ковычками можно сделать наоборот:
<?
$replace 
"'<td>' . (\$1 * 3) . '</td>'";  
# или
$replace '\'<td>\' . ($1 * 3) . \'</td>\''

типа того

  Ответить  
 
 автор: dream-x   (13.08.2008 в 23:54)   письмо автору
 
   для: xx77   (12.08.2008 в 09:40)
 

Здравствуйте. Я решил другим способом проблему почитал о функции preg_replace_callback(); оказаловь все элементарно. Честно говоря я мануал по функции preg_replace читал :) и тоже пытался использовать модификатор 'e' только я не понимал как это можно сделать. Код:

<?php
$content 
file_get_contents("xxx.html");
$search  =  "/<td\>([0-9]{1,})<\/td\>/";
function 
ariph($matches)
  {
   return 
"<td>".round($matches[1]*37)."</td>";
  }
$r preg_replace_callback($search"ariph"$content);
echo 
$r;

Вот так я и поступил.
Спасибо большое ваш метод мне тоже понравился. Спасибо за объяснение.

  Ответить  
 
 автор: xx77   (14.08.2008 в 14:39)   письмо автору
 
   для: dream-x   (13.08.2008 в 23:54)
 

Соглашусь.
использовать preg_replace_callback() похоже правильнее.

вот пара тестов , добавляя или убирая модификатор e раскомментировал поочереди разные варианты,
лучшее время похоже показывает preg_replace_callback()
<pre><?php
list($m$time) = sscanf(microtime(), '0.%s %s');
$time .= '.' $m;

$str 
<td>45</td>  
<td>5</td>  
<td>145</td>  
<td>44</td>'
;  
$str str_repeat($str500);
print 
'<hr/>' strlen($str) . '<hr/>';

$search  "|<td>(\d+)</td>|i";  

/* ~~0.028

$replace = '\'<td>\' . ($1 * 3) . \'</td>\'';   
$str = preg_replace($search, $replace, $str);
*/

/* ~~ 0.014

$replace = create_function('$x', 'return \'<td>\' . ($x[1] * 3) . \'</td>\';');
$str = preg_replace_callback($search, $replace, $str);
*/

///* ~~0.010

function umn($x)
{
return 
'<td>' . ($x[1] * 3) . '</td>';
}
$str preg_replace_callback($search'umn'$str);
//*/

####################################################
print htmlspecialchars(substr($str025)) . '<hr/>' strlen($str);


list(
$m$t) = sscanf(microtime(), '0.%s %s');
print 
'<hr/>' . (($t .= '.' $m) - $time) . "\n";
?></pre>

но всёравно не понимаю для чего round()

умножая целое число на целое , ничего не нужно округлять.
а в случае когда умножение на слишком большие числа
вернёт число в виде 99+E55 round() тоже никак не помогает.

и удобнее вместо [0-9]{1,} записать \d+
это одно и тоже.
такие разные написания на скорость не тестил ,)
да и точности измерения скорости не очень точные,
и разные браузеры выдают разные результаты ,
особенно если измерять дважды на странице

  Ответить  
 
 автор: dream-x   (15.08.2008 в 00:23)   письмо автору
 
   для: xx77   (14.08.2008 в 14:39)
 

Привет. round просто округлить число и все. а так очень интересно спасибо. я еще и новые функции узнал из последнего поста спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования