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 |
#2 · Zasláno: 22. 1. 2016, 17:40:29
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 |
#3 · Zasláno: 22. 1. 2016, 17:40:30
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 |
#6 · Zasláno: 22. 1. 2016, 17:44:26
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 |
#7 · Zasláno: 22. 1. 2016, 17:49:17
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; ?> $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 |
#9 · Zasláno: 22. 1. 2016, 18:08:09
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 |
#12 · Zasláno: 22. 1. 2016, 18:36:27
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 |
#13 · Zasláno: 22. 1. 2016, 18:37:33
Jan Kozák:
Mně jde o to se naučit právě reguláry a práci se soubory... |
||
lionel messi Profil |
#14 · Zasláno: 22. 1. 2016, 18:44:50
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 |
#15 · Zasláno: 22. 1. 2016, 18:47:15
lionel messi:
No i přes to bych to raději nějakým způsobem dořešil... |
||
Keeehi Profil |
#16 · Zasláno: 22. 1. 2016, 18:49:05
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 |
#17 · Zasláno: 22. 1. 2016, 18:51:44
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...
|
||
Časová prodleva: 9 let
|
0