Autor Zpráva
RastyAmateur
Profil
Krásné odpoledne,

rád bych se zeptal, jak lze regulárama upravit .txt soubor. jde o to, že v něm něco mám, a já bych do určitého místa (dejem tomu závorek) přidal text. Příklad:

txt soubor vypadá: blablabla(něco)blíbléblá
a výsledek by měl být blablabla(něco+to_přidané)blíbléblá

nejlépe pomocí regulárů, nechci str_replace()
Keeehi
Profil
Pokud toho můžeš dosáhnout pomocí str_replace, měl bys použít str_replace. Měl by být rychlejší než regulárem.

To něco je známé, nebo to má reprezentovat, že v závorkách může být cokoli co předem neznáš?
Dan Charousek
Profil
RastyAmateur:
nejlépe pomocí regulárů, nechci str_replace()

Jestli je to tak triviální, tak nerozumím tomu požadavku:
$newContent = str_replace("(něco)", "(něco a něco navíc)", $oldContent);
lionel messi
Profil
RastyAmateur:

Pekný podvečer aj tebe.

nejlépe pomocí regulárů, nechci str_replace()

Podľa popisu by práve tu str_replace možno aj stačil, ale zrejme si neuviedol úplné znenie, a preto rešpektujem tvoju požiadavku.

$text = "Lorem ipsum (dolorem) set (amen)";
$pattern = "~\(([^)]*)\)~";
$replacement = "(\\1 to_přidané)";
$return = preg_replace($pattern, $replacement, $text);

Upravené.
Keeehi
Profil
lionel messi:
Drobná chybka
$pattern = '~\(([^)]*)\)~';
$replacement = '($1 to_přidané)';
Dan Charousek
Profil
RastyAmateur:
Jak napsal Keeehi (o celou sekundu dřív! :/)

Jestli chceš změnit obsah ve všech závorkách za: obsah + něco, tak to udělej jak radí lionel messi.
lionel messi
Profil
Keehi:
lionel messi:
Drobná chybka

Vďaka za korekciu, pôvodná verzia chytala do spätnej referencie len jedno písmenko.
RastyAmateur
Profil
Reaguji na všechny, především Dan Charousek:
to "něco" bude proměnné...

lionel messi:
Mohl bych poprosit o konkrétnější vyvsětlení? V regulárech jsem uplný nováček... ten $pattern moc nechápu.

Ještě bych měl dotaz, proč mi nefunguje následující kód:
<?php
$file = file_get_contents($filepath);
$a = preg_replace("#\(".$title."\{(.*)\}\)#","(".$title."{\$1+".$addstring."})",$file);
echo $a;
?>
Ty "#" okolo patternu nevím proč mám. Bez nich mi to vyhazuje chybu. Našel jsem to někde na netu. Ono to teoreticky funguje, jenže před ten výsledek se mi nějakým záhadným způsobem vloží ta cesta, takže výsledek vypadá nějak jako $filepath.$a...

Pozn. V případě, že už to jde dle mých představ. Jak to uložím do toho již existujícího .txt souboru?


Napíšu to narovninu. V rámci svého vzdělání jsem se rozhodl udělat jeden projekt. Abych stále nemusel (především na wz.cz) vytvářet databáze a upravovat několik věcí přímo v kódu atdatd (mám pro to své důvody). Chci si všechna data ukládat do textových souborů a nějakým stylem si je rozdělit - například tímto (zatím aplikuji) (nazev_tabulky{[prvni:druha:treti][teoreticky_druhy_radek_v_mysql:tendruhy:treti]}). Myslím, že je na tom vše docela dobře vysvětlené.

A to co tu teď řeším - přidávání dat do "tabulek". Musím najít tabulku a přidat data... Řekl bych, že by na to patřil regulár \(nazev_tabulky\{(.*)\[pridane:data\]\}\)
Dan Charousek
Profil
RastyAmateur:
Mohl bych poprosit o konkrétnější vyvsětlení? V regulárech jsem uplný nováček...
Funkce substr část řetězce
V uvedeném příspěvku hovořím o preg_match. preg_replace je hodně podobná funkce. Rozdíl je v tom, že shodu nahradí druhým parametrem. V druhém parametru můžeš použít $1, $2, atd... Kde číslo značí kolikátý je to subpattern - něco jako $matches[1], $matches[3] (viz. můj příspěvek)
lionel messi
Profil
RastyAmateur:
lionel messi:
Mohl bych poprosit o konkrétnější vyvsětlení? V regulárech jsem uplný nováček...

V tom prípade sa ti bude hodiť základný český návod alebo komplexné zasvätenie do tajov regulárov (v angličtine, ale venuje sa aj menej obvyklým situáciám, ktoré nie sú popísané na predošlom linku).

Ty "#" okolo patternu nevím proč mám. Bez nich mi to vyhazuje chybu.

V PHP potrebuje knižnica PCRE pracujúca s regulármi v patterne tzv. oddeľovač. Použitím nealfanumerického znaku (nemusí to byť len mriežka) signalizuješ, kde regulár začína alebo končí (myslím, že ide o správanie prevzaté z PERL-u). Za týmto oddeľovačom môžeš ešte predať rôzne informácie — napr. o tom, že pattern nemá rozlišovať malé a veľké písmená a podobne.

Skúsim ti vysvetliť môj pattern znak za znakom:

~ - oddeľovač, tu sa začína samotný regulár

\( - zachytí znak otváracej zátvorky, spätné lomítko je použité, lebo samotný znak ( má v reguláre špecifický význam

([^)]*) - hovorí: „Odchyť ľubovoľný počet znakov okrem uzatváracej zátvorky“ a tento medzivýsledok ulož do tzv. spätnej referencie, aby si k tomu mohol pristúpiť neskôr v replacemente. Práve označenie spätných referencií je špecifický význam klasických zátvoriek v regulárnom výraze. Hranaté zátvorky [] sa používajú na označenie výpočtu znakov, ^ znamená negáciu a * značí ľubovoľný počet znakov (0 až nekonečne veľa). V tomto prípade nechcem trafiť koncovú zátvorku, pretože v reťazci "Lorem (ipsum) dolorem (set)" by som namiesto (ipsum) odchytil (ipsum) dolorem (set)" keďže kvantifikátory (aj hviezdička) vždy odchytávajú najväčší možný rozsah, pokiaľ im programátor výslovne nestanoví inak (hovorí sa tomu žravá varianta).
\) - znak ukončovacej zátvorky (opäť použitý vo význame bežného znaku, čiže opäť s predradeným spätným lomítkom
~ - koncový oddeľovač, ukončenie reguláru
RastyAmateur
Profil
Děkuji především za odkazy, pomohly a pomohou!

A nyní zpět ke konkrétnímu problému. Jak tedy udělám "přepis" souboru tímto způsobem?


Tak jsem si něco vytvořil, a funguje to napůl.
$val = "PRIDAT";
$file = file_get_contents($path);
$a = preg_replace("#(.*)\(".$table."\{(.*)\}\)(.*)#","\$1(".$table."{\$2[".$val."]})\$3",$file);

1) Jak to zapsat do souboru? šlo by to asi file_put_contents(), že ano...
2) V tom souboru je (novatabulka{[aaa:bbb]})(druhatabulka{[aaa:bbb][aaaaaa:gg]}) a výsledek má být (novatabulka{[aaa:bbb][PRIDAT]})(druhatabulka{[aaa:bbb][aaaaaa:gg]}), ovšem výsledek je (novatabulka{[aaa:bbb]})(druhatabulka{[aaa:bbb][aaaaaa:gg][PRIDAT]}). Netuším...
Jan Kozák
Profil
RastyAmateur:
V rámci svého vzdělání jsem se rozhodl udělat jeden projekt. Abych stále nemusel (především na wz.cz) vytvářet databáze a upravovat několik věcí přímo v kódu atdatd (mám pro to své důvody).
Důrazně ti doporučuji, aby sis v rámci svého vzdělávání nastudoval práci s databázemi místo toho, aby ses snažil naprogramovat vlastní databázový systém, který stejně bez velmi důkladné znalosti stávajících systémů nejsi schopen vytvořit.
RastyAmateur
Profil
Jan Kozák:
Mně jde o to se naučit právě reguláry a práci se soubory...
lionel messi
Profil
RastyAmateur:
Jan Kozák:
Mně jde o to se naučit právě reguláry a práci se soubory...

Regulárne výrazy ako také sa môžeš naučiť aj bez práce so súbormi, aj tak ich totiž využiješ. :-)

Jan Kozák má, bohužiaľ, pravdu. Naučiť sa pracovať s databázou (trebárs MySQL) je pre programátora s úrovňou znalostí kdesi medzi úplným začiatočníkom a mierne pokročilým podstatne jednoduchšie, než zvládnuť všetky záludnosti práce so súbormi.

Systém, ktorý vytvoríš na základe ukladania obsahu do súborov, totiž bude náročnejší na správu a navyše bude trpieť množstvom viac i menej závažných nedostatkov.
RastyAmateur
Profil
lionel messi:
No i přes to bych to raději nějakým způsobem dořešil...
Keeehi
Profil
To proč ti to nefunguje tak jak bys chtěl je kvůli žravosti té hvězdičky. Když za druhou přidáš otazník, mělo by to fungovat. Taky je zbytečné (.*) mít na začátku a na konci. Smaž je. Samozřejmě je budeš muset taky smazat z replacementu a přečíslovat reference.

Pro testování regulárních výrazů je výborný web regex101.com který ti barevně označí různé části a ukáže, co se na co matchuje a vysvětlí proč.

Jinak souhlasím s předchozími příspěvky. Klidně si zkoušej na localu hrát se soubory a regexy jen to hlavně nikam nenahrávej. Bude to nepoužitelné, nefunkční, pomalé a nebezpečné.
RastyAmateur
Profil
No dobře. Jelikož mi to moc nejde a vy mě stále přesvědčujete, tak s tím tedy praštím...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: