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

Форум PHP

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

 

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

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

тема: Вставка в строку символа
 
 автор: chexov   (04.02.2009 в 05:34)   письмо автору
 
 

Итак ,есть текстовый файл к примеру text.txt

Файл содержит N-ное колличесвто строк разной длины
Первые 7 символов каждой строки отделены от следущиего текста строки пробелом
Замечание(Строки содержат N-ное колличество пробелов)
Вопрос:
Как мне заменить сразу во всех строках пробел на тире, но только пробелы которые стоят после первых 7 символов каждой строки?

  Ответить  
 
 автор: Loki   (04.02.2009 в 09:42)   письмо автору
 
   для: chexov   (04.02.2009 в 05:34)
 

я бы это сделал с помощью регулярных выражений. что-то типа:
<?
$string
=preg_replace('^(.{7}\s)''\1-'$string);

  Ответить  
 
 автор: chexov   (04.02.2009 в 11:03)   письмо автору
 
   для: Loki   (04.02.2009 в 09:42)
 

как мне применить к файлу?т.е если например 7000 строк?

  Ответить  
 
 автор: Temnovit   (04.02.2009 в 11:14)   письмо автору
 
   для: chexov   (04.02.2009 в 11:03)
 

Если пробел который нужно заменить - гарантированно первый в строке, то подойдет такое решение:
<?
$filename 
'1.txt';

//получаем данные из файла - каждую строку в свой элемент массива
$array file($filename);

//для каждой строки
foreach($array as &$a)
{
  
//заменяем первый встречающийся пробел на тире
  
$a str_replace(' ''-'$a1);
}
?>

  Ответить  
 
 автор: Loki   (04.02.2009 в 11:20)   письмо автору
 
   для: Temnovit   (04.02.2009 в 11:14)
 

foreach($array as $key=>$a)
{
  $array[$key] = str_replace(' ', '-', $a, 1);

а то у Вас результат уходит в "великое ничто"... это при условии что четвертый параметр str_replace делает именно то, что Вы ожидаете:)

  Ответить  
 
 автор: Temnovit   (04.02.2009 в 11:22)   письмо автору
 
   для: Loki   (04.02.2009 в 11:20)
 

Ага, уже успел исправить. Еще подходит амперсант поставить перед $a

  Ответить  
 
 автор: Temnovit   (04.02.2009 в 11:18)   письмо автору
 
   для: chexov   (04.02.2009 в 11:03)
 

Для любителей тонких извращений - заменяем восьмой символ на тире, каким бы он не был:
<?
$filename 
'1.txt';

//получаем данные из файла - каждую строку в свой элемент массива
$array file($filename);

//для каждой строки
foreach($array as &$a)
{
  
//заменяем 8-й символ на тире
  
$a[7] = '-';
}
?>

  Ответить  
 
 автор: chexov   (04.02.2009 в 12:26)   письмо автору
 
   для: Temnovit   (04.02.2009 в 11:18)
 

для любителей тонких извращений ничего не происходит, а код

<?
$filename 
'1.txt'

//получаем данные из файла - каждую строку в свой элемент массива 
$array file($filename); 

//для каждой строки 
foreach($array as &$a

  
//заменяем первый встречающийся пробел на тире 
  
$a str_replace(' ''-'$a'1'); 
?>

выдает ошибку Fatal error: Only variables can be passed by reference в строке где происходит замена пробела на тире

  Ответить  
 
 автор: Temnovit   (04.02.2009 в 16:20)   письмо автору
 
   для: chexov   (04.02.2009 в 12:26)
 

Да, четвертый параметр это не то, что я подумал :)

Попробуйте так:

<?
foreach($array as &$a)
{
  
//заменяем первый встречающийся пробел на тире
  
$a implode"-"explode(" "$a2) );
}
?>

  Ответить  
 
 автор: chexov   (04.02.2009 в 17:19)   письмо автору
 
   для: Temnovit   (04.02.2009 в 16:20)
 

Скрипт выполняется, но содержимое файла не изменяется (как было все с пробелами так и осталось)....какие еще предложения?

  Ответить  
 
 автор: BinLaden   (04.02.2009 в 17:42)   письмо автору
 
   для: chexov   (04.02.2009 в 17:19)
 

Вы вообще этот массив потом записываете в файл или ждёте, что файл обновится сам?

  Ответить  
 
 автор: chexov   (04.02.2009 в 18:24)   письмо автору
 
   для: BinLaden   (04.02.2009 в 17:42)
 

Всем спасибо, вариант
<?php

$filename 
'1.txt'

$array file($filename); 
$f fopen($filename'w+');
foreach(
$array as &$a

$a[7] = '-';
fputs($f$a);
}
fclose($f); 

?>

признан лучшим:)

  Ответить  
 
 автор: AlexNZ   (13.08.2009 в 09:34)   письмо автору
 
   для: chexov   (04.02.2009 в 12:26)
 

Fatal error: Only variables can be passed by reference
Ну разумеется. Вы ведь передаёте третий параметр для str_replace константу '1'
Встроенные функции в целях ускорения (для интерпретируемого языка это очень важно) работают по ссылкам.
Более того, если вы напишите свою функцию с параметром по значению, функция всёравно получит переменную по ссылке и это будет ссылкой до тех пор, пока код не начнет менять содержимое переменной, в этот момент интерпретатор сделает копию (т.е. ссылочный аргумент наконец станет аргументом по значеню).

$a = '1';
$a = str_replace(' ', '-', $a, $a);
не будет ругаться.

  Ответить  
 
 автор: Trianon   (13.08.2009 в 11:02)   письмо автору
 
   для: chexov   (04.02.2009 в 11:03)
 

Утилитой grep, egrep или аналогисной.

AlexNZ , зачем Вы вытащили это старье наверх?

  Ответить  
 
 автор: AlexNZ   (13.08.2009 в 11:49)   письмо автору
 
   для: Trianon   (13.08.2009 в 11:02)
 

Сорри, о каком верхе идёт речь?

  Ответить  
 
 автор: Trianon   (13.08.2009 в 11:53)   письмо автору
 
   для: AlexNZ   (13.08.2009 в 11:49)
 

Тему никто не трогал полгода.
Тему, по которой вроде как стороны пришли к консенсусу.
Зачем она Вам понадобилась?

При чем как я заметил, не она одна.

  Ответить  
 
 автор: AlexNZ   (13.08.2009 в 11:58)   письмо автору
 
   для: Trianon   (13.08.2009 в 11:53)
 

А вот оно что... я то на неё через поисковик попал...
Ну теперь уже только время всё исправит. )))
Впрочем, интерес и время не сильно связаны.

P.S. что-то наш диалог в оффтопе...

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

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