Avatar billede w13 Novice
25. juni 2008 - 10:17 Der er 14 kommentarer og
1 løsning

Hente content-type med reg.exp.

Hej Eksperter.

Da jeg sidder og roder med noget webmailsystem, har jeg brug for at aflæse content-type fra en linje med følgende struktur:

Content-Type: text/plain; charset="iso-8859-1"

Denne linje skulle så returnere "text/plain".

Er der nogen, der lige har et bud på noget reg.exp. til det? =)

På forhånd tak!
Avatar billede erikjacobsen Ekspert
25. juni 2008 - 10:49 #1
$s='Content-Type: text/plain; charset="iso-8859-1"';

if (preg_match('/content-type:\s*(.*?)(;.*)$/i',$s,$r)) {
    print "$r[1]\n";
}
Avatar billede jakobdo Ekspert
25. juni 2008 - 10:55 #2
Noget i stil med:

if(preg_match('%Content-Type:\s([a-z/-]+)%i', $input, $output)){
  echo $output[1];
}

Content-Tyåe bør korrekt være med stort C og T, men mange skriver med småt eller en blanding, derfor er i tilføjet.

OG har samtidig testet på lidt flere Content-Type's...
Avatar billede w13 Novice
25. juni 2008 - 11:03 #3
Jeg fik ikke Eriks til at spille, mens Jakobs fungerer bare.

Så smid du et svar, Jakobdo. =)
Avatar billede erikjacobsen Ekspert
25. juni 2008 - 11:24 #4
Ja, jeg mangler en "?"

if (preg_match('/content-type:\s*(.*?)(;.*)?$/i',$s,$r)) {
Avatar billede jakobdo Ekspert
25. juni 2008 - 13:23 #5
Svar!
Avatar billede jakobdo Ekspert
25. juni 2008 - 14:01 #6
Takker for point.
Avatar billede w13 Novice
27. juni 2008 - 12:17 #7
Nå, jeg har lige et ekstraspørgsmål, som I måske kan svare på.

Jeg får følgende Array:

Array
(
    [0] => Content-Type: text/plain
    [1] => text/plain
)

når jeg bruger jeres reg.exp. på følgende mail:


--=_c8d8840dde18dc1ae4c28e52ace45f87
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Sp=F8rgsm=E5l : Specialtegn i mail
Bruger    : pidgeot
Handling  : Kommentar
Kategori  : Programmering :: Script :: PHP=20
Link      : http://exp.dk/spm/836446
------------------------------------
=D8nsker du ikke l=E6ngere at abonnere p=E5 kategorien kan du v=E6lge den f=
ra via din konto side eller dette link:
http://exp.dk/afmeld.phtml?catid=3D2&key=3Dd0d0a529f0a046e05b91e8e9db89a0f0

Venlig hilsen Eksperten

Vil du annoncere i Eksperten mails eller p=E5 www.eksperten.dk?
Kontakt: Peer Jensen, 77 300 221, p.jensen@idg.dk
--=_c8d8840dde18dc1ae4c28e52ace45f87
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Eksperten E-Mail</title><style type=3D"text/css">.expbod=
y,.exptd,.expth{background-color:#ffffff;color:#000000;font-family:verdana,=
arial,helvetica,sans-serif;font-size:9pt;}.expth{text-align:left;padding-ri=
ght:10px;}.exptd,.expth{padding:2px;}.exph1{font-size:13pt;}a:hover.explink=
{text-decoration:none;color:#006699;}.expsynopsis{background-color:#f0f5fa;=
border:1px solid #dde4ee;padding:5px;font-size:10pt;}</style></head><body c=
lass=3D"expbody" bgcolor=3D"#ffffff" text=3D"#000000" link=3D"#006699" alin=
k=3D"#006699" vlink=3D"#006699"><h1 class=3D"exph1"><a href=3D"http://exp.d=
k/spm/836446" class=3D"explink">Programmering :: Script :: PHP :: Specialte=
gn i mail</a></h1><table><tr><th class=3D"expth">Sp=F8rgsm=E5l</th><td clas=
s=3D"exptd"><a href=3D"http://exp.dk/spm/836446#rid7144836" class=3D"explin=
k">Specialtegn i mail</a></td></tr><tr><th class=3D"expth">Bruger</th><td c=
lass=3D"exptd"><a href=3D"http://exp.dk/bruger.phtml?navn=3Dpidgeot" class=
=3D"explink">pidgeot</a></td></tr><tr><th class=3D"expth">Handling</th><td =
class=3D"exptd">Kommentar</td></tr><tr><th class=3D"expth">Kategori</th><td=
class=3D"exptd"><a class=3D"explink" href=3D"http://exp.dk/spm/Programmeri=
ng/">Programmering</a> :: <a class=3D"explink" href=3D"http://exp.dk/spm/Pr=
ogrammering/Script/">Script</a> :: <a class=3D"explink" href=3D"http://exp.=
dk/spm/Programmering/Script/PHP/">PHP</a> </td></tr></table><p>=D8nsker du =
ikke l=E6ngere at abonnere p=E5 kategorien kan du v=E6lge den fra via din <=
a href=3D"http://exp.dk/konto.phtml" class=3D"explink">konto side</a> eller=
<a href=3D"http://exp.dk/afmeld.phtml?catid=3D2&amp;key=3Dd0d0a529f0a046e0=
5b91e8e9db89a0f0" class=3D"explink">dette link</a>.</p><p>Venlig hilsen Eks=
perten</p><br />Vil du annoncere i Eksperten mails eller p=E5 www.eksperten=
..dk?<br />Kontakt: Peer Jensen, 77 300 221, <a href=3D"mailto:p.jensen@idg.=
dk" class=3D"explink">p.jensen@idg.dk</a></body></html>
--=_c8d8840dde18dc1ae4c28e52ace45f87--



Jeg havde håbet, jeg også ville få data fra denne linje med i Array'et:

Content-Type: text/html; charset="iso-8859-1"

Men som I kan se, er det kun text/plain, jeg får fat i.
Er det noget, der let kan ændres, så det får det ønskede resultat?
Avatar billede erikjacobsen Ekspert
27. juni 2008 - 12:20 #8
Hvad er det ønskede resultat? Hele linien: Content-Type: text/html; charset="iso-8859-1"  ?
Avatar billede w13 Novice
27. juni 2008 - 12:23 #9
Nej, altså jeg ville gerne have:

Array
(
    [0] => text/plain
    [1] => text/html
)

Men hvis det fortsætter det nuværende mønster, ville det blive:

Array
(
    [0] => Content-Type: text/plain
    [1] => text/plain
    [2] => Content-Type: text/html
    [3] => text/html
)

Og det går da også an, selvom det andet selvfølgelig ville være bedre.
Avatar billede w13 Novice
27. juni 2008 - 12:29 #10
Jeg må også indrømme, at jeg endnu ikke helt har forstået, hvordan:

preg_match('%Content-Type:\s([a-z/-]+)%i', $input, $output)

kan returnere både "Content-Type: text/plain" og "text/plain".
Altså jeg kan ikke gennemskue, hvor i udtrykket der defineres, at disse 2 ting skal hentes ud. Bortset fra det forstår jeg godt, hvad mønsteret betyder.
Avatar billede jakobdo Ekspert
27. juni 2008 - 12:55 #11
Prøv med:
preg_match('%(Content-Type:\s[a-z/-]+)%i', $input, $output)
Avatar billede w13 Novice
27. juni 2008 - 13:04 #12
Så resulterer det i:

Array
(
    [0] => Content-Type: text/plain
    [1] => Content-Type: text/plain
)
Avatar billede erikjacobsen Ekspert
27. juni 2008 - 13:07 #13
Du skal bruge preg_match_all, og vi kan vel simplificere det lidt:


if (preg_match_all('/content-type:\s*(.*?)[\s;]/i',$s,$r)) {
    print_r ($r);
}

Du får nu et andet slags array tilbage, men det ser du vel.

Det er dog en noget usikker måde at finde din contenttype, da den også leder i selv beskeden i den mail.
Avatar billede w13 Novice
27. juni 2008 - 13:14 #14
Hmmm. Ok. Jeg har lavet en løsning lige nu, hvor jeg først deler mailen op (i dette tilfælde ved "--=_c8d8840dde18dc1ae4c28e52ace45f87") og så finder jeg content-type for hver af de opdelte. Det er sikrere, som du også siger Erik.

Men ellers mange tak for den videre hjælp også! :)
Avatar billede erikjacobsen Ekspert
27. juni 2008 - 13:31 #15
Det er givetvis den tiltænkte måde at gøre det på. Vi gemmer preg_match_all til en anden gang ;)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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