logo
02.09.2019 22:10
1
Nějak mi to už nemyslí, ale potřebuji:
1. otevřít soubor
2. vyhledat řádek (podle části textu)
3. celý nalezený řádek změnit novým textem
(ne jenom část,ale celý řádek)
4. uložit soubor

Díky
02.09.2019 23:55
2
a musíš to být v php? V linuxu je na to třeba nástroj "sed".

V php to bude složitější, záleží jak ten soubor je velký, z hlavy by mohlo fungovat něco takovéhoto:

PHP kód:
<?php

$obsah 
file('cesta_k_souboru.txt');
function 
nahrad_radek($radek) {
    
$co_hledat="část řádku";
    
$cim_nahradit="nový obsah pro řádek";
    if (
stristr($radek$co_hledat)) {
        return 
"$cim_nahradit\n";
    }
    return 
$radek;
}
$novy_obsah array_map('nahrad_radek',$obsah);
file_put_contents('cesta_k_novemu_souboru.txt'implode(''$novy_obsah));
(Nezkoušel jsem to, psáno z hlavy). Každopádně cest jak toho docílit je spousta, tohle bude paměťově a výkonově velice náročné na velké soubory, u malých se to ztratí. Lepší ale na to použít specializovaný nástroj, třeba ten sed. Samozřejmě poté také záleží na kódování souboru a dalších maličkostech, lepší by bylo, kdybys sem hodil příklad.
02.09.2019 23:59
3
rychlejší variantu poradil google https://www.linuxquestions.org/quest...c-line-523519/
03.09.2019 07:27
4
Děkuji.
03.09.2019 10:07
5
Kód:
preg_match_all('/word}/m', $textfile, $matches);
03.09.2019 10:13
6
Původně odeslal kdosiodjinud
Kód:
preg_match_all('/word}/m', $textfile, $matches);
tohle ti ale najde jen řádky, které odpovídají předpisu, již ti ale neumožní je změnit, nevíš ani jejich pozici v textu (to bys musel přihodit flag PREG_OFFSET_CAPTURE) a ideálně to co hledáš escapovat přes preg_quote("word", "/"), jinak to bude házet syntax errory.
03.09.2019 15:29
7
Musí-li to být v PHP a je-li zdrojový soubor 'plain text' (a ne přehnaně velký, do desetitisíců řádků)...
PHP kód:
$lines file($filename);
foreach(
$lines as $i => $line) {
    
preg_replace($pattern$replacement$lines[$i], $limit);
}
file_put_contents($filenameimplode("\n"$lines)); 
03.09.2019 16:59
8
ak mozem, upravim podla zadania:

Kód:
3. celý nalezený řádek změnit novým textem
(ne jenom část,ale celý řádek)
Kód:
$findme = 'hladany_text';
$replace = 'nahrada riadku';

$lines = file($filename);
foreach($lines as $i => $line) {
    if ( strpos($line, $findme) !== false ) {
     $line[$i] = $replace;
     break;
    }
}
file_put_contents($filename, implode("\n", $lines));
03.09.2019 17:06
9
Původně odeslal ne
ak mozem, upravim podla zadania:

Kód:
3. celý nalezený řádek změnit novým textem
(ne jenom část,ale celý řádek)
Kód:
$findme = 'hladany_text';
$replace = 'nahrada riadku';

$lines = file($filename);
foreach($lines as $i => $line) {
    if ( strpos($line, $findme) !== false ) {
     $line[$i] = $replace;
     break;
    }
}
file_put_contents($filename, implode("\n", $lines));
drobná poznámka, funkce strpos zohledňuje velikost písmen, proto jsem ve svém kódu volil funkci stristr. Je otázka co je vhodnější varianta :)
03.09.2019 17:44
10
Btw. nezkoušel jsem ten kód - možná bych ještě otestoval, jaké zakončení řádků má ten soubor - někdy končí znakem #13, někdy #10, někdy jsou oba. Podle toho upravit $line, nebo implode().
03.09.2019 18:18
11
Děkuji všem.
Jde o klasický textový soubory o max. 300 řádcích kódu.
Vyhledávat budu podle MD5 textu.
Takže bych soubor načetl klidně do array rozdělené podle #13.

Pak by se mohlo použít při nalezení řádku např. 4
$line[4] = nový text.
03.09.2019 21:24
12
Původně odeslal TomášX
drobná poznámka, funkce strpos zohledňuje velikost písmen, proto jsem ve svém kódu volil funkci stristr. Je otázka co je vhodnější varianta :)
case insensitive je lepsia fc. stripos :)