Gå til innhold

Litt hjelp med regexp


Anbefalte innlegg

Hei, jeg sitter her og driver med regexp men jeg møter på et problem. Vil hente ut det som er i mellom to elementer, disse elementene kan oppstå flere ganger.

 

Altså, la oss for å si det enkelt at jeg har en tekst fil med tall mellom disse tallen er det alt fra html kode til linjeskift. Hver gang det kommer et tall vil jeg hente alle bokstavene mellom det tallet og neste. Uansett om det er bokstav

 

hei 1her kommer<b>

jeg9

 

Her vil jeg hente ut

her kommer<b>

jeg

 

Tenker meg at det må blie noe som dette ([0-9].*[0-9]), men det fungerer ikke. Noen som kan forklare meg?

Lenke til kommentar
Videoannonse
Annonse

Hvis du har en tekst som dette: tall 1 mellom 2 mellom 3.

Så vil følgende kode returnere mellom, mellom.

preg_match_all('/\d([^\d]+)/s', $string, $result);

 

Men denne koden vil bare returnere en mellom siden den har "brukt opp" 2 tallet på første matchingen og begynenr først å matche igjen ved 3 tallet og det er ikke noe fjerde tall.

preg_match_all('/\d(.+)\d/sU', $string, $result);

 

Ble litt dårlig forklart men bare test det på regex verktøyet mitt (http://regex.larsolavtorvik.com/) så vil du skjønne hva jeg mener :-)

 

Håper dette hjalp.

Lenke til kommentar

Det der fungerer ikke, mulig du forklarte veldig dårlig, men jeg får det ikke til å funke. Tingen er at jeg trenger i grunn bare en måte å fortelle regexp at fra et punkt til et annet kan hva som helst komme så mange ganger det vil.

 

Man har et vanlig utrykk og så kommer man til et punkt der man vi la hva som helst skje til man møter på neste faste punkt. La si at man har <body> tagen og alt som er der inne vil man ha, men da </body> kommer vil man ikke ha mer.

(<body>HVA SKAL STÅ HER INNE FOR Å AKSEPTERE ALT MULIG?</body>)

Lenke til kommentar

PHPs regex er greedy som default (se http://www.skdevelopment.com/php-regular-expressions.php), så uttrykkene fanger opp så mye som mulig.

 

Men hvis du ser på modifier-ene du kan bruke (http://no2.php.net/manual/en/reference.pcre.pattern.modifiers.php), så ser du at punktum ikke fanger opp newlines med mindre du bruker modifieren s.

 

Så hvis du ikke får til noe med det aCa foreslo, så er det nok du som har forklart veldig dårlig hva du prøver på.. :)

Lenke til kommentar

Kan du komme med konkrete eksempler for hva du er på jakt etter. Den koden jeg skrev høyere opp burde fungere til eksempelene dine.

 

Det å hente ut alt mellom body start og body slutt.

 

preg_match_all('/<body>(.+)<\/body>/imU', '(<body>HVA SKAL STÅ HER INNE FOR Å AKSEPTERE ALT MULIG?</body>)', $result);

 

Her satte jeg den som ungreedy. Slik at du er sikker på at den stopper ved første </body> men mulig du ikke trenger den U'en til slutt.

 

Som sagt... kom med ett konkret eksempel så skal vi nok finne en løsning for deg :-)

Endret av aCa
Lenke til kommentar

<!-- /Meteorologens vurdering -->





         <div class="fifteen">
           <table summary="15-dagars varsel" class="days">
             <tbody>


               <tr>

                 <td class="empty" />


                 <td>

                   <h3>I morgen<br /><span>22.04.2008</span></h3>
                   <table summary="">
                     <tbody>
                       <tr>
                         <td class="w-icon" title="Lettskyet">
                           <img src="http://fil.nrk.no/yr/grafikk/sym/b38/02d.png" width="38" height="36" alt="Lettskyet" /></td>
                         <td class="plus">12°</td>
                         <td class="wind" title="Flau vind, 0,9 m/s fra sør-sørvest">
<img src="http://fil.nrk.no/yr/grafikk/vindpiler/32/vindpil.0000.200.png" alt="Flau vind, 0,9 m/s fra sør-sørvest" /></td>

                       </tr>
                     </tbody>
                   </table>
                   <p>Lettskyet. Flau vind, 0,9 m/s fra sør-sørvest. 0 mm nedbør i døgnet.</p>
                 </td>

                 <td>

                   <h3>Onsdag<br /><span>23.04.2008</span></h3>
                   <table summary="">
                     <tbody>
                       <tr>
                         <td class="w-icon" title="Lettskyet">
                           <img src="http://fil.nrk.no/yr/grafikk/sym/b38/02d.png" width="38" height="36" alt="Lettskyet" /></td>
                         <td class="plus">13°</td>
                         <td class="wind" title="Svak vind, 2,1 m/s fra sør-sørvest">
<img src="http://fil.nrk.no/yr/grafikk/vindpiler/32/vindpil.0025.205.png" alt="Svak vind, 2,1 m/s fra sør-sørvest" /></td>

 

Her vil jeg hente ut det som er mellom <h3>I morgen<br /><span>22.04.2008</span></h3> og </table>. Konkret eksempel?

Ja det er utheting av data fra yr.no

Lenke til kommentar
Her vil jeg hente ut det som er mellom <h3>I morgen<br /><span>22.04.2008</span></h3> og </table>. Konkret eksempel?

Ja det er utheting av data fra yr.no

 

Det var ett mer konkret eksempel ja. En av måtene man kan hente ut dataene du er på jakt etter er med dette uttrykket.

 

preg_match('/<h3>[\w ]+<br \/><span>[0-9.]+<\/span><\/h3>(.*)<\/table>/is', $string, $result);

 

Håper det hjelper.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...