Ik heb een externe link met deze broncode:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
<div class="articleContent">TEKST TEKST TEKST</div>
<hr>
<table>
</table>
<hr>
<div class="articleContent">TEKST TEKST TEKST</div>
<hr>
<table>
</table>
<hr>
<div class="articleContent">TEKST TEKST TEKST</div>
<hr>
<table>
</table>
<hr>
<div class="articleContent">TEKST TEKST TEKST</div>
</body>
</html>

Nu wil ik met explode de tekst uit de divs ophalen, zodat ik ze in mijn database kan verwerken.

<?php
$link = file_get_contents("http:///link.html");

$div_1_1 = explode('<div class="articleContent">',$link);
$div_1_2 = explode("</div>", $div_1_1[1]);

$div_2_1 = explode('</div>',$div_link);
$div_2_2 = explode('<div class="articleContent">', $div_2_1[1]);
$div_2_3 = explode('</div>', $div_2_2[1]);

echo $div_1_2[0]; // div 1
echo $div_2_3[0]; // div 2

// div 3 en 4???
?>

Het lukt mij wel om de eerste en tweede div op te halen, maar vanaf de derde lukt het niet meer. Dat komt dus omdat alle divs exact hetzelfde ID hebben.

Iemand enig idee hoe ik teksten uit alle divs kan ophalen?
Adoptive Solution op 31/08/2016 19:29:54

Zet zo'n aangeleverd bestand op de server en geef een link.

Kijken of het werkt.

\\
In het voorbeeld staan de divs op een nieuwe regel.

In het bestand waar je naar link staat alles op één regel.

Je moet dus een andere regexp maken.

Adoptive Solution op 31/08/2016 19:49:45

In het voorbeeld staan de divs op een nieuwe regel.

In het bestand waar je naar link staat alles op één regel.

Je moet dus een andere regexp maken.




Weet je ook hoe?
Gevonden :

preg_match_all("/(<div.*>(.+)<\/div>)+/U", $link, $output_array);


Let op de /U

Toevoeging op 31/08/2016 19:55:42:

Weet je ook hoe?


http://www.phpliveregex.com/

"U non-greedy matching by default"
Afgezien van de vraag of dit topic legitiem is, is dat NIET hoe je met regexes je HTML leest. Wat probeer je te doen? De server onderuit te trekken? Regexes schrijf je altijd zo exact mogelijk op wat je wilt, met zo min mogelijk wildcards. Zoiets als dit dus:
~<div[^>]*>((?:(?!</div>).)+)~
Ben van Velzen op 31/08/2016 20:10:25

Afgezien van de vraag of dit topic legitiem is, is dat NIET hoe je met regexes je HTML leest. Wat probeer je te doen? De server onderuit te trekken? Regexes schrijf je altijd zo exact mogelijk op wat je wilt, met zo min mogelijk wildcards. Zoiets als dit dus:
~<div[^>]*>((?:(?!</div>).)+)~


Dus ~<div[^>]*>((?:(?!</div>).)+)~ is beter dan /(<div.*>(.+)<\/div>)+/U ?
Sneller, minder geheugengebruik, geen risico op catastrophic backtracking met een crash van PHP tot gevolg. Ik laat aan jou over of dat beter is.

Reageren