Avatar billede gertnissen Nybegynder
14. august 2005 - 01:13 Der er 12 kommentarer og
1 løsning

"søg" og "substr" tekst fra lang tekst ala preg_

Hvis jeg har en tekst ala

bla bla <h4>vigtigt</h4> bla bla

hvordan finder jeg så [vigtigt], der vil altid være <h4> tags omkring teksten og [bla bla] kan være alt muligt crap.

Min tekst ligger i en array.
Avatar billede olebole Juniormester
14. august 2005 - 12:26 #1
<ole>

Kan der stå HTML-tags mellem <h4> og </h4>?
Kan der være flere <h4>-tags i strengen?

/mvh
</bole>
Avatar billede gertnissen Nybegynder
14. august 2005 - 15:46 #2
hej ole

Der kan godt stå tags mellem <h4> og </h4> og der vil kun være en par pr streng.
Avatar billede olebole Juniormester
14. august 2005 - 15:59 #3
Du kan vel skrive:

$s = "jhk jhkj <i>hkjhk</i> jhk jhk <h4>En <u>overskrift</u></h4> jh kjhkjhk <b>jhk</b> jhkj hkjh kjhkj hkjh";
$header = preg_replace("/[\w\W]*<h4>([\w\W]*)<\/h4>[\w\W]*/i", "$1", $s);
print $header;
Avatar billede gertnissen Nybegynder
14. august 2005 - 16:10 #4
kanont, det virker jo perfekt - tak for hjælpen, smider du et svar.

Du skriver "$1" i anden parameter - hvorfor ?
Avatar billede olebole Juniormester
14. august 2005 - 16:13 #5
Det refererer til udtrykket i parentesen (i RegExp-udtrykket). Altså jeg replace'er hele strengen med det, der bliver fundet i parentesen ... comprende?  :)

Mere her:
    http://dk2.php.net/manual/da/function.preg-replace.php
Avatar billede olebole Juniormester
14. august 2005 - 16:15 #6
- og det lille 'i' i slutningen af RegExp-udtrykket betyder, at søgningen foretages case-insensitive ... dvs, at også '<H4>blablabla</h4>' vil blive fanget  ;o)
Avatar billede gertnissen Nybegynder
14. august 2005 - 17:54 #7
Desværre forstår jeg stadig ikke helt hvorfor det virker ;-(

Du bruger en RegExp replace funktion til at returnere det søgte og den (for mig) underlige $1.
Avatar billede olebole Juniormester
14. august 2005 - 18:30 #8
Selve min RegExp:
    /[\w\W]*<h4>([\w\W]*)<\/h4>[\w\W]*/i

\w betyder ét eller andet word-tegn
\W betyder ét eller andet ikke-word-tegn

[\w\W]* betyder en serie af ingen eller flere tegn af de to slags

En slash (/) har en selvstændig betydning, så den skal escapes i </h4> - altså: <\/h4>

Så er der kun parentesen tilbage. En preg_replace tager tre argumenter:
1. Et RegExp-udtryk
2. En replace-streng
3. En streng, der skal søges i

Hvis du sætter en parentes i RegExp-udtrykket - som jeg har gjort omkring indholdet af vores h-tags - kan indholdet af den parentes bruges i replace-strengen i form af $1. Det er det, man kalder en back-reference.
Havde vi brugt to parenteser kunne jeg have refereret til indholdet af de to parenteser med henholdsvis $1 og $2. Prøv f.eks. denne:

$s = "jhk jhkj <i>hkjhk</i> jhk jhk <h4>En <u>overskrift</u></h4> jh kjhkjhk <b>jhk</b> jhkj hkjh kjhkj hkjh";
$header = preg_replace("/([\w\W]*)<h4>([\w\W]*)<\/h4>[\w\W]*/i", "Der stod:<br>$1<br>- før det første tag ... og:<br>$2<br>- imellem de to tags", $s);
print $header;

Håber, det hjalp lidt - og ellers er der lidt mere om RegExp-syntaksen her:
    http://dk2.php.net/manual/da/reference.pcre.pattern.syntax.php

Tak for points  ;o)
Avatar billede olebole Juniormester
14. august 2005 - 18:36 #9
- og jeg ved egentlig ikke, hvorfor jeg overhovedet fik startet på at bruge preg_replace, for det er jo preg_match, man bør bruge  :D

$s = "jhk jhkj <i>hkjhk</i> jhk jhk <h4>En <u>overskrift</u></h4> jh kjhkjhk <b>jhk</b> jhkj hkjh kjhkj hkjh";
preg_match("/<h4>([\w\W]*)<\/h4>/i", $s, $header);
print $header[1];
Avatar billede olebole Juniormester
14. august 2005 - 18:38 #10
Her er $header et array, hvor første element indeholder hele den fundne streng:
    <h4>En <u>overskrift</u></h4>

- og andet element indeholder indholdet af vores parentes:
    En <u>overskrift</u>
Avatar billede olebole Juniormester
14. august 2005 - 18:39 #11
- men du ender zq da med en indføring i RegExp *LooOooL*
Avatar billede gertnissen Nybegynder
14. august 2005 - 19:08 #12
Det var en fornem forklaring.

Faktisk var det dette afsnit der fik 10 øren til at flade
"Hvis du sætter en parentes i RegExp-udtrykket - som jeg har gjort omkring indholdet af vores h-tags - kan indholdet af den parentes bruges i replace-strengen i form af $1. Det er det, man kalder en back-reference.
Havde vi brugt to parenteser kunne jeg have refereret til indholdet af de to parenteser med henholdsvis $1 og $2."

preg_match virker også fint - hvad er mest korrekt at benytte ?
Avatar billede gertnissen Nybegynder
14. august 2005 - 19:30 #13
Efter lidt mere læsning har jeg valgt at benytte preg_match - Tak for hjælpen og de gode forklaringer.
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