Avatar billede hmm10 Nybegynder
27. maj 2012 - 12:46 Der er 4 kommentarer

pattern

Hej alle,

Jeg sidder og søger efter et specifikke elementer i min html, og mangler dertil et korrekt pattern, som tager de inderste elementer. Jeg kan ikke sikre, at det er korrekt/valid html, som jeg har.

HTML:

a<span>b
c  <span>d</span>e
f  <span>g
h    <span>i</span>j
k  </span>l
m</span>n
o<span>p</span>q

Ønsket returnering (array):

<span>d</span>
<span>i</span>
<span>p</span>

Jeg har lavet et pattern ala '/\<span>(.*?)</span>/', men (.*?) accepterer også <span>-elementet - og derved medtages dette også.

Nogen forslag?
Avatar billede Hans Mester
27. maj 2012 - 15:46 #1
function FindInnerValues($matches){
    global $innervalue;
    global $innercount;
    global $result;   

    if(isset($matches[3])){
        // </span>
        if($innercount > 0){
            $result[] = $innervalue;
            $innercount = 0;
        }
    }else{
        $innercount++;
        $innervalue = $matches[2];
    }
}

$innervalue = "";
$innercount = 0;
$result = array();

preg_replace_callback('#(?:<(span)>(.*?)(?=</?span>))|(?:<(/span)>)#is', 'FindInnerValues', $text);


foreach($result as $a){
    echo "$a<br>";
}


burde i grove træk kunne gøre det
Avatar billede olebole Juniormester
27. maj 2012 - 17:52 #2
<ole>

"Jeg kan ikke sikre, at det er korrekt/valid html, som jeg har." >> Hvis koden ikke overholder bestemte mønstre, giver det ikke mening at bruge mønstergenkendelse (= RegExp).

Hvis brug af RegExp skal give mening, må du i det mindste oplyse, hvilke mønstre der kan være gældende i de tilfælde, hvor koden ikke overholder HTML.

/mvh
</bole>
Avatar billede hmm10 Nybegynder
31. maj 2012 - 13:05 #3
tilaffald: Jeg afprøver.

olebole: Enig. Det, som jeg mener med korrekt/valid er blot, at det ikke er muligt at ligger html ind i f.eks. en DOM Parser.
Avatar billede olebole Juniormester
31. maj 2012 - 14:19 #4
Når du bruger slashes som delimiters i din RegExp, kan du ikke skrive </span> i mønstret uden at escape dén slash. Alternativt kan du skrive:

<?php
$foo = "a<span>b
c  <span>d</span>e
f  <span>g
h    <span>i</span>j
k  </span>l
m</span>n
o<span>p</span>q";

preg_match_all("#<span>.*?</span>#", $foo, $matches);
var_dump($matches);
?>
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