|
|
|
|
|
для: xx77
(14.08.2008 в 14:39)
| | Привет. round просто округлить число и все. а так очень интересно спасибо. я еще и новые функции узнал из последнего поста спасибо. | |
|
|
|
|
|
|
|
для: 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($str, 500);
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($str, 0, 25)) . '<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+
это одно и тоже.
такие разные написания на скорость не тестил ,)
да и точности измерения скорости не очень точные,
и разные браузеры выдают разные результаты ,
особенно если измерять дважды на странице | |
|
|
|
|
|
|
|
для: 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;
|
Вот так я и поступил.
Спасибо большое ваш метод мне тоже понравился. Спасибо за объяснение. | |
|
|
|
|
|
|
|
для: 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>\'';
|
типа того | |
|
|
|
|
|
|
|
для: xx77
(11.08.2008 в 10:23)
| | Здравствуюте xx77. Я вот не понял ваш метод т.к. мне надо найти число потом его перемножить и потом записать на это же место. Вот пример файлаЖ
<td>45</td>
<td>5</td>
<td>145</td>
<td>44</td>
|
| |
|
|
|
|
|
|
|
для: Николай2357
(10.08.2008 в 23:49)
| | В любое место можно ставить. Для этого есть fseek(). | |
|
|
|
|
|
|
|
для: 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($fp, 9); #устновить курсор перед байтом 9
fputs($fp, '777777777777'); # перезапись 12и байт, не больше не меньше
fseek($fp, 0); # на начало
$txt = fread($fp, 1024);
print $txt;
fclose($fp);
|
| |
|
|
|
|
|
|
|
для: 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);
|
не проверял, но как то так. Если не сработает, напишите, буду вспоминать. | |
|
|
|
|
|
|
|
для: Николай2357
(11.08.2008 в 00:35)
| | Подробнее можно? Я просто пытаюсь щас через регулярные написать но никак :-( | |
|
|
|
|
|
|
|
для: dream-x
(11.08.2008 в 00:28)
| | Там как минимум метки ставить надо, по регуляркам трудно делить. Если файлы все Ваши, то разметьте чем нибудь, комментами например, чтоб не видно было, а потом explode() можно, и вставлять, что нужно. Если непонятно написал, могу подробнее... | |
|
|
|
|