Portál AbcLinuxu, 17. července 2025 06:56


Dotaz: Regulární výraz-získání hodnot

26.9.2007 18:32 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Regulární výraz-získání hodnot
Přečteno: 317×
Odpovědět | Admin

Nevíte, jak ze souboru tohoto typu:

 <option value="152">Abertamy</option>
                      <option value="269">Adamov u Brna</option>
                      <option
              value="479">Adolfovice</option>
                      <option value="182">Adršpach</option>
                      <option value="170">Albrechtice</option>
                      <option
              value="271">Aš</option>
                      <option value="293">Babylon</option>
                      <option
              value="459">Bačetín</option>
                        <option value="179">Bartošovice v
                          Orlických horách</option>
                      <option value="410">Batelov</option>
                      <option value="155">Batňovice</option>
                        <option value="233">Bečov nad
                          Teplou</option>
                      <option value="1">Bedřichov</option>
                      <option
              value="349">Bechyně</option>

získat asi nejlépe pomocí nějakého rogulárního výrazu ty hodnoty value="xxx" a pak textové hodnoty jako např.: Abertamy, a udělal z nich řetězce jako

INSERT INTO #__tabulka SET id=152, name=Abertamy;

Za odpovědi předem děkuji.

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

26.9.2007 18:38 neaktivni | skóre: 24 | blog: neaktivni
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
vzhledem ke sve lenosti bych to udelal asi pomoci PHP (i to vkladani do db) pres SimpleXML
26.9.2007 18:44 pupu | skóre: 31
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud je to co radek, to jeden zaznam, je to trivialni. Pokud ne, tak to uz tak trivialni neni.

trivialni reseni muze byt treba takhle: perl -ne '/<option value=\"(\d+)\">([^<]+)<\/option>/ && print "$2 $1\n"'

Vyhovuje?

poznamka pro administratory: je opravdu tak zasadni problem pridat do zahlavi zatrhavatko 'prosty text'? prepisovat html znovu do html je drobet opruz
26.9.2007 18:53 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
Je to co řádek to záznam, ale problém je, že někdy je text option na jednom řádku a pokračování na druhém
26.9.2007 19:31 pupu | skóre: 31
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
Hmm. Vzhledem k tomu, ze jsem zname prase jdouci cestou nejmensiho odporu a na estetiku nehledici, udelal bych to klidne takhle (pokud bych tedy fakt hodne spechal):

perl -e 'while (<>) {chomp;$radek=$radek." ".$_;}; $radek=~s/option>/option>\n/g; print $radek' <vstup |perl -ne '/<option\s+value=\"(\d+)\">([^<]+)<\/option>/ && print "$2 $1\n"' >vystup

Akorat to produkuje mezery v mistech, kde je zalomeny radek, protoze tam ty mezery skutecne jsou. Asi bych doporucil spis nejake uz hotove udelatko pro praci s XML, tohle uz je vazne pakarna.
26.9.2007 19:56 pupu | skóre: 31
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
No, neda mi to ;-) Pokud by se nelibily mezery, jeste muzete pridat jedno s/\ \ +/\ /g; - pokud jsou v tom souboru tedy opravdu jen mezery a ne treba tabulatory.
26.9.2007 19:02 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud nechcete podnkita dobrodružství ohledně toho, jak se tagy zrovna zalomí, nepoužívejte regulární výrazy, ale udělejte z toho normální XML (tj. zabalte to celé např do <data>…</data>) a použijte XPath. Takže třeba libovolný xslt procesor a použijte následující transformaci:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="text"/>
	<xsl:template match="option">
INSERT INTO #__tabulka SET id=<xsl:value-of select="@value"/>, name='<xsl:value-of select="."/>';
	</xsl:template>
</xsl:stylesheet>
Pokud přidáte k datovému souboru instrukci pro zpracování, zobrazí vám výsledek i každý lepší webový prohlížeč.
<?xml version="1.0 ?>
<?xml-stylesheet type="text/xml" href="template.xsl" ?>
<data>
	<option value="152">Abertamy</option>
	…
</data>
26.9.2007 19:33 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
A jde nějak pomocí toho zajistit, aby se odstranily zalomená řádků? Když je v tom souboru např.:
Benešov nad 
                          Černou
tak aby se z toho stalo
Benešov nad Černou
26.9.2007 19:56 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
Zkuste místo <xsl:value-of select="."/> použít
<xsl:value-of select="normalize-space(.)"/>
případně
<xsl:value-of select="normalize-space(translate(.,'&#10;&#13;','  '))"/>
26.9.2007 20:11 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
Super, díky, funguje;-);-)
26.9.2007 19:48 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Regulární výraz-získání hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud toužíte po reg. výrazech, tak velmi zhruba nástin v Javě:
Pattern p = Pattern.compile("<option value=\"([1-9][0-9]*)\">(.*?)</option>", Pattern.DOTALL);
Matcher m = p.matcher(...data...);
while(m.find()) System.println("INSERT INTO #__tablulka SET id=" + m.group(1) + ", name=" + m.group(2));
ale osobně bych šel do té transformace :)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.