Avatar billede cyfer Nybegynder
15. marts 2014 - 16:25 Der er 12 kommentarer og
1 løsning

Regex nemt spm.

Hey

Sidder og kæmper med lidt php/regex. Skal udtrække et tal fra en source code, et specifik sted (ekstern URL) og derefter trække fra med 1.34.

Koden der er på siden ser således ud (eksempel):

<td align="right">11.29</td></tr><tr><td>Unik fast tekst</td><td>

Tallet der er skal trækkes ud er altså 11.29 (dette tal er dynamisk og skifter). Resten af koden er 100% fast og skifter ikke. Derfor kan denne bruges til at finde frem til det dynamiske tal, for derefter at trække 1.34 fra.

Kan en herfra strikke et script sammen til mig? På forhånd tak.
Avatar billede arne_v Ekspert
15. marts 2014 - 16:50 #1
proev:

'/<td align="right">(\d+\.\d{2})</td></tr><tr><td>Unik fast tekst</td><td>/is'
Avatar billede moddi100 Seniormester
15. marts 2014 - 17:16 #2
Som arne_v angiver:

<?php

$code = '<td align="right">11.29</td></tr><tr><td>Unik fast tekst</td><td>';

if(!preg_match('#<td align="right">(\d+\.\d{2})</td>#i', $code, $matches))
    die("Intet resultat");

$result = (float)$matches[1] - 1.34;

echo "Tallet er: $result";

?>
Avatar billede cyfer Nybegynder
15. marts 2014 - 17:26 #3
Hej moddi100. Jeg kan ikke få arne_v's til at virke. Giver en fejl. Din derimod virker fint, bortset fra at du mangler at tage højde for "Unik fast tekst". I source coden er denne det eneste der adskiller denne ellers generiske linje fra resten. Kan du ændre din regex til at tage højde for at denne linje skal komme efter tallet for at den extracter netop lige præcis det tal der`
Avatar billede cyfer Nybegynder
15. marts 2014 - 17:32 #4
... har måske været lidt uklar i mit org. spørgsmål. Som sagt virker dit script perfekt. Bortset fra at den trækker et forkert tal, netop fordi samme kode optræder mange steder i source code. Det eneste der adskiller denne fra de andre er netop "Unik fast tekst".
Avatar billede moddi100 Seniormester
15. marts 2014 - 17:37 #5
Dette skulle gerne klare det så:
<?php

$code = '<td align="right">11.29</td></tr><tr><td>Unik fast tekst</td><td>';

if(!preg_match('#<td align="right">(\d+\.\d{2})</td></tr><tr><td>Unik fast tekst</td><td>#im', $code, $matches))
    die("Intet resultat");

$result = (float)$matches[1] - 1.34;

echo "Tallet er: $result";

?>
Avatar billede moddi100 Seniormester
15. marts 2014 - 17:47 #6
Fejlen fra arne_v's svar skyldes at han har været lidt hurtigt og anvendt / til at omslutte det pattern han har opskrevet. Det går normalt fint, men ikke når tegnet bruges i hans regex:

preg_match('/Hello World /', $code); // OK
preg_match('/Hello <b>World</b> /', $code); // Ikke ok, da / indgår i regex'et
preg_match('/Hello <b>World<\/b> /', $code); // OK, da / nu er blevet escaped

/ anvendes jo netop typisk i html-kode, hvorfor det kan være nemmere at udskifte denne med et andet tegn såsom #:

preg_match('#Hello <b>World</b> #', $code); // OK
preg_match('@Hello <b>World</b> @', $code); // OK
preg_match('{Hello <b>World</b> }', $code); // OK

preg_match('#Hello # <b>World</b> #', $code); // Ikke ok
preg_match('@Hello # <b>World</b> @', $code); // OK, da @ ikke optræder inde i regex'et.

Giver det mening?
Avatar billede cyfer Nybegynder
15. marts 2014 - 18:09 #7
Det er smukt. Og det giver fint mening. Regex er lidt en svær størrelse synes jeg. Hvis jeg skal lave samme trick. Blot på nedenstående kode. Hvordan ville det så se ud?

Det er lidt modsat her. Den unikke tekst står før og tallene over 11.29 er dynamiske..

<td width="200"><p class=text>Unik fast tekst</p></td>
<td width="104"><p class=text align="right">5.96</p></td>
<td width="104"><p class=text align="right">9.03</p></td>
<td width="104"><p class=text align="right">11.29</p></td>
Avatar billede cyfer Nybegynder
17. marts 2014 - 19:43 #8
Nothing...?
Avatar billede cyfer Nybegynder
19. marts 2014 - 19:46 #9
Ingen overhovedet?
Avatar billede moddi100 Seniormester
15. april 2014 - 23:43 #10
Kan da se vi aldrig fik afsluttet her. Er spørgsmålet stadigvæk relevant?

Antager vi at du KUN ønsker at trække tallet 11.29 ud fra teksten i #7, bliver dit regex således (og ja det er ikke det kønneste regex:

<?php

$code = '<td width="200"><p class=text>Unik fast tekst</p></td>
<td width="104"><p class=text align="right">5.96</p></td>
<td width="104"><p class=text align="right">9.03</p></td>
<td width="104"><p class=text align="right">11.29</p></td>';

if(!preg_match('#' . preg_quote('Unik fast tekst') . '(?:(?:\s|.)+?(\d+\.\d{2})){3}#im', $code, $matches))
    die("Intet resultat");

$result = (float)$matches[1] - 1.34;

echo "Tallet er: $result";

?>
Avatar billede cyfer Nybegynder
22. april 2014 - 10:32 #11
Tak. Jeg fik selv sjusset mig frem til en løsning. Men læg et svar. Så lukker jeg tråden.
Avatar billede moddi100 Seniormester
26. april 2014 - 15:35 #12
Svar :)
Avatar billede cyfer Nybegynder
28. april 2014 - 15:00 #13
Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester