Autor Zpráva
moom
Profil
Dobrý den, potřeboval bych prosím nějakou radu.
Mám jeden textový soubor, který obsahuje asi 100
samostatných kapitol, jejichž název pokaždé začíná
tagem H1 a následný text je v několika blocích odstavce P.

A já bych potřeboval vybrat text od začátku nadpisu H1 až po poslední
znak před začátkem dalšího nadpisu. S tím, že by se použil obsah nadpisu
pro meta tagy TITLE a DECRIPTION a zároveň by se mohl použít i pro
název nového samostatného souboru. Toto by bylo ideální řešení :)

Ukázka zdrojového souboru:

<h1>Tady je nadpis</h1>
<p>Toto je nějaká věta
a zde je její pokračování
a ještě kousek</p>
<h1>Tady je další nadpis</h1>
<p>Toto je nějaká věta
a zde je její pokračování
a ještě kousek</p>


A ideální výsledek prvního souboru:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>Zde bude nadpis H1</title>
	<meta name="description" content="Zde bude nadpis H1" />
</head>
<body>
<div>
	<p>Zde bude obsah odstavce</p>
</div>
</body>
</html>


Snad by to mělo jít nějak pomocí PHP a regulárních výrazů. Jednou mně
podobný úkol pomohl vyřešit PHP guru, kapacita a eskamotér, ale už
nemůžu najít na něj kontakt :(

Máte prosím nějakou radu.
Michal Benda
Profil
A proč nepoužiješ xml jako výchozí formát (tzn. zdrojový soubor) a pomocí xml parseru nebo xslt to pak nepředěláš do toho cílového html?
moom
Profil
No já mám připravený text v InDesignu, kde je otagovaný
text. No asi tomu nerozumím, asi bych potřeboval konkrétnější radu :)
Michal Benda
Profil
za prvé - pokládáš tu podobné ne-li stejné dotazy: http://diskuse.jakpsatweb.cz/?action=vthread&forum=3&topic=129849

a za druhé - to chceš text z InDesignu kopírovat a vkládat do nějakého formuláře, který by ti vyhodil ten cílový obsah? Nebo co si přesně představuješ?
motik
Profil
moom:
Jednou mně
podobný úkol pomohl vyřešit PHP guru

jako že ti napsal ten kód? jako pokud vůbec nerozumíš php, tak zkus sekci 'práce a zakázky'..

a pokud ti nejdou jen reg. výrazy, tak to zkus např. přes explode()..


diskuse = diskutovat o problému a né si napsat o funkční řešení...
moom
Profil
děkuji za názory, omlouvám se, pokud jsem někomu
zvedl žaludek. Snažím se vyřešit problém, tak jsem se
obrátil sem. Děkuji za mravokárné příspěvky a za
poposunutí v řešení.
moom
Profil
no a ještě k funkčnímu řešení... dnes jsem strávil asi
pět hodin učením regulárních výrazů a tak jsem myslel,
že se popošoupnu... samozřejmě funkční řešení není
na závadu. Děkuji za pomoc...
okolojdouci
Profil *
Použil bych http://simplehtmldom.sourceforge.net
Tím z toho vytáhneš postupně všechny <h1> a pak všechny <p>. Jen nevím, jestli to pak budeš mít podle čeho spojit.
Druhá možnost je samozřejmě udělat to ručně, tzn. najít v textu <h1>, pak od dané pozice </h1>, pak hledat <h1> a <p> .. je to možná amatérismus, ale v mém případě by to bylo určitě rychlejší, než zmíněných 5 hodin.
motik
Profil
moom:
dnes jsem strávil asi
pět hodin učením regulárních výrazů a tak jsem myslel,
že se popošoupnu...

že tu není žádný náznak tvého snažení...

aneb jak naznačil okolojdouci, tak snad pokud ti nejdou reg. výr., tak co nezkusit něco jiného..
díval ses vůbec na tu funkci explode()? (netvrdím, že je to ideální řešení)
$soubor = "<h1>Tady je nadpis</h1>
<p>Toto je nějaká věta
a zde je její pokračování
a ještě kousek</p>
<h1>Tady je další nadpis</h1>
<p>Toto je nějaká věta
a zde je její pokračování
a ještě kousek</p>";

$cast = explode('<h1>', $soubor);
$pocet = count($cast);

for ($i = 1; $i < $pocet; $i++)
  {
    list($title, $popis) = explode("</h1>", $cast[$i]);
    echo "<b>" . $title . "</b>" . $popis . "<br>";
  }



rád ti pomůžu, ale chtělo by to vidět snahu a né jen samé výluvy
moom
Profil
No máte pravdu, tak jenom pro ilustraci snahy :)
Přečetl jsem manuál regulárních příkazu pana Satrapy,
v Luxoru prolistoval knihu Regulární výrazy, kuchařka
programátora a snažil se prostudovat SED co mně
běží v Terminálu. Zkoušel jsem programy Sublime Text 2
a TextMate a nakonec zjistil, že je jednoduší v InDesignu
použít hledat nahradit a záložku GREP, kde si pomocí
menu můžu nadefinovat co se má hledat a on sám
InDesign přidává zkratky regulárních výrazů.

Ale nepřišel jsem na to jak vyhledat od začátku H1
až po další H1. Vymyslel jsem si, že budu hledat
od </p><h1> po následující výskyt </p><h1>,
ale příslušný regulární výraz ne a ne složit aby to našlo
skrze entry na konci veškerý text až po další výskyt...

</p>.*+\s+<h1>.*+\s+


Pravda je, že bych to měl už dávno ručně vykopírované,
ale nedá mě to spát a rád bych se něco přiučil :) a tak jsem
napsal sem.

No a dneska se zdá, že se budu učit PHP :) Jdu prostudovat
vloženou ukázku :) No a ještě pro ilustraci vědomostí, umím
(X)HTML a CSS3
moom
Profil
Jo a ještě jsem to chtěl zautomatizovat, protože jsem chtěl
nadpis H1 využít pro Title, Description a pokud možno i jako
název nově vzniklého souboru, který může být s diakritikou,
kterou pak odstraním hromadným přejmenováním.

Ale asi je to nad mé možnosti :) No nevadí, každopádně
regulární výrazy jsou dobrá pomůcka
motik
Profil
moom:
Jo a ještě jsem to chtěl zautomatizovat, protože jsem chtěl
nadpis H1 využít pro Title, Description a pokud možno i jako
název nově vzniklého souboru, který může být s diakritikou,

zkoušel sis pustit ten příklad co jsem ti tu napsal?

// načtení souboru sobor.txt, kde máš uložený to <h1>..... do $soubor
$soubor = file_get_contents('soubor.txt');
// tady se ten soubor rozdělí do polí (oddělovač je <h1>
$cast = explode('<h1>', $soubor);
//spočítá počet prvků pole $cast
$pocet = count($cast);

// provede se cyklus ($i = 1 je tam pro to, že soubor začíná <h1> a pro $i=0 je tam prázdné pole -> byl by prázdný soubor
for ($i = 1; $i < $pocet; $i++)
  {
    // explode rozdělí dannou část oddělovačem </h1> a tudíž a na první pozici máš $title, druhá je $popis (pomocí funkce to tak přiřadíš, ještě to jde např. $a = explode("</h1>", $cast[$i]); $title = $a[0]..
    list($title, $popis) = explode("</h1>", $cast[$i]);
    // proměnou $out si uprav podle potřeby, dej si tam tu stránku a na místa kde chceš vypsat nadpis dej $title, pro popis dej $popis !!bacha na uvozovky!!
    $out = "<b>" . $title . "</b>" . $popis . "<br><br />";
    // uloží to daný soubor název bude číslo.htm
    file_put_contents($i.".htm", $out);
  }

s tímto už by si měl být schopný si poradit..
moom
Profil
huráááá jdu to otestovat a dám vědět.
Musel jsem švagrovou a manželku odvést
někam na nákupy a celý den byl v pr...

Zatím děkuju, děkuju, jdu to testnout :)
moom
Profil
Paráda, funguje to krásně!!! Prvně mně to zahlásilo chybu, že
nejsou práva pro zapisování, tak jsem složce přiřadil povolení
a už to sází soubor jeden za druhým.

Mohl bych prosím ještě jednu doplňující otázku.
Musel jsem dát v rámci H1 doplnit SPAN kde je autor
článku.

<h1>Nadpis <span>Autor článku</span></h1>

Jak bych prosím dosáhl toho, abych měl text ve formátu:

Nadpis / Autor článku

Kde první <SPAN> se promění v lomítko, nebo jiný znak |

No a poslední otázka :) dají se pojmenovávat soubory
místo 1, 2, 3... podle Title... ale asi to není důležité.
To bych mohl sednout na PC a v TC to hromadně přejmenovat
podle txt souboru, kde budu mít názvy pod sebou.

A nejste náhodou z Prahy, nebo Brna, že bych vám koupil
pivko s utopencem :)

No a pro náhodné čtenáře mám zatím tento kód:

<?php
// načtení souboru sobor.txt, kde máš uložený to <h1>..... do $soubor
$soubor = file_get_contents('soubor.txt');
// tady se ten soubor rozdělí do polí (oddělovač je <h1>
$cast = explode('<h1>', $soubor);
//spočítá počet prvků pole $cast
$pocet = count($cast);

// provede se cyklus ($i = 1 je tam pro to, že soubor začíná <h1> a pro $i=0 je tam prázdné pole -> byl by prázdný soubor
for ($i = 1; $i < $pocet; $i++)
  {
    // explode rozdělí dannou část oddělovačem </h1> a tudíž a na první pozici máš $title, druhá je $popis (pomocí funkce to tak přiřadíš, ještě to jde např. $a = explode("</h1>", $cast[$i]); $title = $a[0]..
    list($title, $popis) = explode("</h1>", $cast[$i]);
    // proměnou $out si uprav podle potřeby, dej si tam tu stránku a na místa kde chceš vypsat nadpis dej $title, pro popis dej $popis !!bacha na uvozovky!!
    $out =  
    "
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
<meta name=\"keywords\" content=\"$title\" />
<meta name=\"description\" content=\"$title\" />
<title>$title</title>
</head>

<body>
<h1>$title</h1>
$popis
</body>
</html>
    ";
    // uloží to daný soubor název bude číslo.htm
    file_put_contents($i.".htm", $out);
  }
  ?>
moom
Profil
jejda já mám radost :)
motik
Profil
moom:
Mohl bych prosím ještě jednu doplňující otázku.
Musel jsem dát v rámci H1 doplnit SPAN kde je autor
článku.
>
1
>
<h1>Nadpis <span>Autor článku</span></h1>
>
>
Jak bych prosím dosáhl toho, abych měl text ve formátu:
>
Nadpis / Autor článku
>
Kde první <SPAN> se promění v lomítko, nebo jiný znak |
>
No a poslední otázka :) dají se pojmenovávat soubory
místo 1, 2, 3... podle Title... ale asi to není důležité.

list(.....
$titleautor = str_replace('<span>', ' | ', $title);
$titleautor = str_replace('</span>','',$titleautor);
$out = ....... <h1>$titleautor</h1>
file_put_contents($title."htm",......


ale to už jsou celkem drobný a nenáročný úpravy, který bys při troše vůli mohl udělat sám.. zkus se trošku zapojit a nepsat jen požadavky....
moom
Profil
Super, děkuji, děkuji, děkuji. Doplnil jsem to tam a toto je výsledný kód.
Ještě jednou díky za otevření do světa nových netušených možností PHP.
Ještě jsem se pokusil přidat titleautor do názvu souboru spolu se změnou
na malá písmena. Odstranění diakritiky už udělám hromadným přejmenováním :)

Jenom moc netuším jak je nadefinovaná proměnná $popis
mohu prosím poprosit o malé vysvětlení a popošoupnutí :)

<?php

$soubor = file_get_contents('soubor.txt');
$cast = explode('<h1>', $soubor);
$pocet = count($cast);

for ($i = 1; $i < $pocet; $i++)
  {

    list($title, $popis) = explode("</h1>", $cast[$i]);
    $titleautor = str_replace('<span>', ' | ', $title);
    $titleautor = str_replace('</span>','',$titleautor);

    $out =  
    "
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
<meta name=\"keywords\" content=\"$titleautor\" />
<meta name=\"description\" content=\"$titleautor\" />
<title>$title</title>
</head>

<body>
<h1>$titleautor</h1>
$popis
</body>
</html>
    ";

    file_put_contents($i."-".strtolower($titleautor).".htm", $out);
  }

  ?>
Tori
Profil
moom:
Jenom moc netuším jak je nadefinovaná proměnná $popis
mohu prosím poprosit o malé vysvětlení a popošoupnutí :)
$text = 'zacatek<br>konec';
$pole = explode('<br>', $text); // $pole = array(0=>'zacatek', 1=>'konec')
list($zacatek, $konec) = $pole; // Hodnoty prvních dvou prvků pole uloží do těchto proměnných
Klikněte si na ty funkce, odkazujou do manuálu.
moom
Profil
Děkuji, děkuji. Budu si muset koupit nějaký manuál PHP
a něco naštudovat, pro lepší a hlubší pochopení.
Já jsem vlastně grafik a umím jenom HTML a CSS
a bylo by dobré mít i tyto znalosti :)

Máte prosím referenci na nějakou dobrou knihu,
stránku kde začít se samostudiem.
Tori
Profil
moom:
Koukněte na Návody, články a knihy, je tam dost témat o literatuře pro PHP.
moom
Profil
paráda, děkuji, děkuji :) koukám, že máte nick Tori, nejste náhodou
admin z Nyxu? Tam na mně občas vykoukne půlka krásné tváře
s touto přezdívkou :) Jéééé... že bych dostal radu přímo od slavné Tori :)
mně snad klepne :)
moom
Profil
klep
moom
Profil
Lidi zlatí tak jsem konečně rozdělil finální text a
zjišťuji, že soubor vytvořil uživatel _www místo
můj uživatel. Takže nemám práva na zapisování
a změnu souborů.

Tušíte prosím jak je změním na sebe.
Pracuji na Mac OS X Lion.

Prosím, prosím, prosím
moom
Profil
Omlouvám se za unáhlený text. Dal jsem zkopírovat
celou složku a už jsou práva přepsaná na mě.
Jakožto tvůrce souboru.... :)
Tori
Profil
moom:
soubor vytvořil uživatel _www místo můj uživatel. Takže nemám práva na zapisování a změnu souborů.
Já jsem tohle vyřešila tak, že jsem si přidala skupinu, ve které je i webserver (na SUSE Linuxu je to www). Pak stačí pro složku včetně obsahu (anebo pro celý document root) nastavit vlastníka vás, skupinu www (nebo jak se jmenuje u vás), a přístupová práva rw pro vlastníka i skupinu.
<mimo-téma>
Nyx jsem doteď neznala, takže vás nemusí klepat. :-) Ale díky.
</mimo-téma>
moom
Profil
Tori:
Jo jo, já mám taky webserver, tedy myslím složku
která je součástí mého účtu na Mac OS a jmenuje se
Sites, nebo teď v českém systému Webové stránky
a běží mně v ní PHP (po drobném zásahu do nějakého souboru)

Ale když kouknu na vlastníka této složky jsem tam já.

No stačilo vzít všechny vygenerované soubory
zkopírovat je jinam a jsem už "tvůrcem" :)

No a teď se chystám, těch 700 knižních stran textu,
což je 230 kapitol pokrátit na prvních třeba 300 písmen,
nebo 30 slov, jako anotace k jednot. kapitolám. Ale
moje PHP znalosti jsou špatné, tak to budu muset udělat
ručně... :(

Netušíte prosím, jestli by šlo stejně jako se rozdělil soubor
podle nadpisů H1, rozdělit soubor na H1, plus následujících
300 písmen. No uzavření do </p> nebo </em></p>
nebo </sup></p> bych si už asi udělal ručně.

Máte prosím nějaké popokopnutí :)
Tori
Profil
moom:
Rozdělovat to můžete třeba stejně jako v [#17]. Nadpis už víte jak zjistit, a v proměnné $popis je text kapitoly, tak ho jen osekáte na 300 znaků pomocí mb_substr nebo iconv_substr - koukněte do zdejšího FAQ, je to tam dobře popsané.
moom
Profil
ok, ok, jdu to nastudovat :)
děkuji děkuji za popošoupnutí :)

asi musím skutečně koupit nějaký manuál
PHP, protože začínám mít pocit, že mé znalosti
HTML a CSS jsou trošku mimo oproti těmto
technikám :)
moom
Profil
Jsem tele, knedla a blb. Tak jsem zkoušel vyextrahovat všechny
A linky ze soubor.txt, ale prostě nemůžu přijít na to, jak to udělat.
Napsal jsem:

<?php

// Create DOM from URL or file
$html = file_get_contents('soubor.txt');

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';

?>


Ale hlásí to hlášku: Call to a member function find() on a non-object in...

No a když bych chtěl použít mb_substr tak zase netuším jak zadat soubor.
Uznávám, že se těžko vysvětluje, když neznám php, ale rád bych se přiučil :)
prosím, prosím, prosí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:

0