Úprava textu pomocou regulárnych výrazov

Programovacie jazyky, rady, poradňa...
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa Peter Michalík »

Potreboval by som vyriešiť nasledovnú úlohu, nejaký skript, čo by to dokázal.

Je vstupný textový súbor v html v štruktúre:

Kód: Vybrať všetko

<h2><a NAME="01">Kapitola 1</h2>
  text text
  <h3><a NAME="02">1. odsek</h3> bla bla bla
    bla bla bla
  <h3><a NAME="03">2. odsek</h3> bla bla bla
    bla bla bla
     <h4>Hlavička</h4>
        text
<h2><a NAME="04">Kapitola 2</h2>
atď...
a potreboval by som pred každý riadok s hlavičkou <h1>, <h2>, <h3> atď. vsunúť riadok so štruktúrou:
$$$/Názov hlavičky/Názov ďalšej úrovne hlavičky/Názov ďalšej úrovne hlavičky
Ten odkaz NAME tam môže a nemusí byť, ignoruje sa.

a vyzeralo v to teda asi takto:

Kód: Vybrať všetko

$$$/Kapitola 1
<h2><a NAME="01">Kapitola 1</h2>
   text text
$$$/Kapitola 1/1. odsek
  <h3><a NAME="02">1. odsek</h3> bla bla bla
    bla bla bla
$$$/Kapitola 1/2. odsek
  <h3><a NAME="03">2. odsek</h3> bla bla bla
    bla bla bla
$$$/Kapitola 1/2. odsek/Hlavička
     <h4>Hlavička</h4>
        text
$$$/Kapitola 2
<h2><a NAME="04">Kapitola 2</h2>
atď...
Vedel by to niekto prosím napísať?

Dík
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa BX »

Tak na rýchlo :P Nie je to možno najšťastnejšie riešenie, ale na tomto tvojom krátkom príklade funguje. Vyskúšaj. Čo bude zle, opravím :)

Kód: Vybrať všetko

$code = file("text.html"); // Vstupny subor

$path = array();

$pat = "/<h(\d)>(<a name=\"\d+\">)?([\w\.\sľščťžýáíé]+)/i";

for($i = 0; $i < count($code); $i++)
{
	if(preg_match($pat, $code[$i], $m))
	{
		if($m[1] == "2") 
		{
		 $path = array();
		 
		 $path[1] = "\$\$\$";
		 $path[2] = "/".$m[3];
		}
		else
		{
		 $path[(int)$m[1]] = "/".$m[3];
		}
		
		
		echo "\n<hr>".implode($path)."<hr>\n";
	}
	echo $code[$i];
	
}
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa Peter Michalík »

Dík, prosím ťa, v čom to mám spustiť? Je to python?
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa Peter Michalík »

Nainštaloval som wamp a nakopíroval skript do projektového adresára, ale na obrazovke vidím len samotný skript :(

Nedalo by sa to urobiť príp. v niečom inom tak, aby sa spustením skriptu vytvoril nový súbor, myslím python alebo ruby
Prílohy
obr.jpg
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa BX »

Takto. A nabudúce napíš, v akom jazyku to chceš.

Kód: Vybrať všetko

<?php
$code = file("text.html"); // Vstupny subor

$path = array();

$pat = "/<h(\d)>(<a name=\"\d+\">)?([\w\.\sľščťžýáíé]+)/i";

for($i = 0; $i < count($code); $i++)
{
   if(preg_match($pat, $code[$i], $m))
   {
      if($m[1] == "2")
      {
       $path = array();
      
       $path[1] = "\$\$\$";
       $path[2] = "/".$m[3];
      }
      else
      {
       $path[(int)$m[1]] = "/".$m[3];
      }
      
      
      echo "\n<hr>".implode($path)."<hr>\n";
   }
   echo $code[$i];
   
}
?>
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa Peter Michalík »

Už to zobrazuje, ale zobrazí pôvodný súbor, bez tých vložených $$$ . Text má príponu .htm

Prikladám pre istotu súbor.
Prílohy
text.zip
(27.64 KiB) 15 stiahnutí
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa BX »

Dal si zlú ukážku :P
Tu máš upravený súbor aj script.
Prílohy
edited.zip
(29.87 KiB) 15 stiahnutí
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa Peter Michalík »

Špica, ide to. Vedel by php prosím ťa vytvoriť z toho výstupný súbor? Lebo je toho viac a aby som nemusel toľko krát dávať uložiť ako. :?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa BX »

Lenivec :P

Kód: Vybrať všetko

<?php

$code = file("text.htm");
$path = array();
$pat = "/<h(\d)>(<a name=\"\d+\"><\/a>)?([^<]+)/i";
$f = fopen("output.htm", "a");

for($i = 0; $i < count($code); $i++)
{
	if(preg_match($pat, $code[$i], $m))
	{
		if($m[1] == "3") 
		{
		 $path = array();
		 $path[0] = "/".$m[3];
		}
		else
		{
		 $path[(int)$m[1]] = "/".$m[3];
		}

		fwrite($f, "\n<hr>&#36;&#36;&#36;".implode($path)."<hr>\n"); // &#36; je znak dolara. Naformatuj si to uz ako chces.
	}
	fwrite($f, $code[$i]);
}

?>
<hr>Subor output.htm vytvoreny.
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa Peter Michalík »

Perfektné :) :) :)

Bx, díky moc, veľmi si mi pomohol :smt006

Narazil som aj na dokumenty, ktoré sú jednoúrovňové a nemajú podkapitoly a nemajú <h2>...<hx>.

Ako by vyzeral skript, keď pred každý riadok, napr.
<p><a NAME="44"></a><font size=+2>Názov kapitoly</font>
by sa vsunul riadok:
$$$/Názov kapitoly
Teda by vzniklo:
$$$/Názov kapitoly
<p><a NAME="44"></a><font size=+2>Názov kapitoly</font>

súbor je v prílohe

//autoeditácia príspevku (22 Mar 2011, 10:07)
Prílohy
nebojte.zip
(204.03 KiB) 14 stiahnutí
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Úprava textu pomocou regulárnych výrazov

Príspevok od používateľa BX »

:arrow:
Prílohy
edited.zip
(216.68 KiB) 14 stiahnutí
Napísať odpoveď