preg_match hulp gezocht
Heb een vraagje over het matchen van een preg_match op een website adres.
De volgende code heb ik gemaakt, wat overigens prima werkt:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$file_string = file_get_contents('https://website.nl');
preg_match('/"picture"(.*)"title"/', $file_string, $title);
$title_out = $title[1];
echo $title_out ;
?>
$file_string = file_get_contents('https://website.nl');
preg_match('/"picture"(.*)"title"/', $file_string, $title);
$title_out = $title[1];
echo $title_out ;
?>
Alleen in de broncode van de website komt "title" meerdere malen voor en de preg_match pakt daarbij de laatste "title" op de website. echter wil ik dat hij de eerste de beste "title" na "picture" pakt.
Kan iemand mij hier in helpen? ik ben niet zo erg in thuis maar spelende wijs gaat me het prima af.
misschien zijn er voorbeelden van andere hoe men dit kan oplossen?
alvast bedankt
groetjes Natascha
Gewijzigd op 03/12/2021 12:44:17 door Natascha deeno
Gewijzigd op 03/12/2021 13:33:59 door Rob Doemaarwat
Een gewetensvraag, stel dat ik nu de 3e plaatje uit een pagina wil laden, is er een mogelijkheid om 3e "picture" of 3e "title" aan te roepen?
nogmaals dank
Natascha
op mijn website heb ik meerdere plaatjes staan met dezelfde regels, nu pakt bij deze prima omdat deze de eerste in de pagina is, daar op volgende staan er meerdere die dezelfde regels hebben.
dacht eerst met preg_match_all en dan tellen vanaf de eerste "picture" iets met >3 om de 3e plaatje op te pakken maar dan geeft ie foutmeldingen
preg_match_all('/"picture"(.*>3)"title"/', $file_string, $title);
In $titles zitten nu *alle* titels. Haal hier dan de 3e uit (kijk even naar de print_r($titles) voor de indeling; hier is nog mee te "spelen" door als 4e parameter de juiste "flags(s)" mee te geven - zie de docs in de link bij Ozzie).
De bron code is random, de plaatjes wisselen in een soort van carrousel op diversen momenten van de dag, enige wat vast blijft om te taggen zijn de
en stukje code aan het einde van de plaatjes. daarvan wil ik de 3 plaatje in de match opnemen:
Code (php)
1
2
3
4
5
2
3
4
5
<a img,"picture":"https://website.net/images/4570b755658c4d6d9633adab48fbfa75/1000x1000-000000-80-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
<a img,"picture":"https://website.net/images/4570b755658c4d6d9638fadauhjhmm75/1000x1000-000000-65-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
<a img,"picture":"https://website.net/images/4570b76890769896878h7779898798ui/1000x1000-000000-77-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
<a img,"picture":"https://website.net/images/8798798j8h8jjkluyojnj90j980uojlj/1000x1000-000000-20-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
<a img,"picture":"https://website.net/images/54ju7de546fuyi86ibiyff66ghjgjgjh/1000x1000-000000-87-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
<a img,"picture":"https://website.net/images/4570b755658c4d6d9638fadauhjhmm75/1000x1000-000000-65-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
<a img,"picture":"https://website.net/images/4570b76890769896878h7779898798ui/1000x1000-000000-77-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
<a img,"picture":"https://website.net/images/8798798j8h8jjkluyojnj90j980uojlj/1000x1000-000000-20-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
<a img,"picture":"https://website.net/images/54ju7de546fuyi86ibiyff66ghjgjgjh/1000x1000-000000-87-0-0.jpg","title":"geen omschrijving van plaatje"},"show":><br>
echo $titles[2][0];
hebben?
Eigenlijk wil dan uiteindelijk:
https://website.net/images/4570b76890769896878h7779898798ui/1000x1000-000000-77-0-0.jpg
kunnen zien, dus het 3e plaatje.
Excuus hoor maar ik begrijp die [2][0]; niet helemaal, ik ga even zoeken/spelen of ik kan begrijpen ten opzicht van matchen de 3e image.
Wat geeft:
Code (php)
1
2
3
4
2
3
4
<?php
preg_match_all('/"picture"(.*?)"title"/', $file_string, $titles);
echo '<pre>' . print_r($titles, 1) . '</pre>';
?>
preg_match_all('/"picture"(.*?)"title"/', $file_string, $titles);
echo '<pre>' . print_r($titles, 1) . '</pre>';
?>
Dan geeft u nu dit weer, 2 maal een Array
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Array
(
[0] => Array
(
[0] => "picture":"https://website.net/images/9ca0a009904d60fcccef20d680f5370a/1000x1000-000000-80-0-0.jpg","title"
[1] => "picture":"https://website.net/images/d4e1eb3be395e1545a1a6e841d3eb63c/1000x1000-000000-80-0-0.jpg","title"
[2] => "picture":"https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg","title"
[3] => "picture":"https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg","title"
[4] => "picture":"https://website.net/images/ced16733944378217630f613c277f34a/1000x1000-000000-80-0-0.jpg","title"
[5] => "picture":"https://website.net/images/74160d6a4681c101268f64451847b0d7/1000x1000-000000-80-0-0.jpg","title"
)
[1] => Array
(
[0] => :"https://website.net/images/9ca0a009904d60fcccef20d680f5370a/1000x1000-000000-80-0-0.jpg",
[1] => :"https://website.net/images/d4e1eb3be395e1545a1a6e841d3eb63c/1000x1000-000000-80-0-0.jpg",
[2] => :"https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg",
[3] => :"https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg",
[4] => :"https://website.net/images/ced16733944378217630f613c277f34a/1000x1000-000000-80-0-0.jpg",
[5] => :"https://website.net/images/74160d6a4681c101268f64451847b0d7/1000x1000-000000-80-0-0.jpg",
)
)
(
[0] => Array
(
[0] => "picture":"https://website.net/images/9ca0a009904d60fcccef20d680f5370a/1000x1000-000000-80-0-0.jpg","title"
[1] => "picture":"https://website.net/images/d4e1eb3be395e1545a1a6e841d3eb63c/1000x1000-000000-80-0-0.jpg","title"
[2] => "picture":"https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg","title"
[3] => "picture":"https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg","title"
[4] => "picture":"https://website.net/images/ced16733944378217630f613c277f34a/1000x1000-000000-80-0-0.jpg","title"
[5] => "picture":"https://website.net/images/74160d6a4681c101268f64451847b0d7/1000x1000-000000-80-0-0.jpg","title"
)
[1] => Array
(
[0] => :"https://website.net/images/9ca0a009904d60fcccef20d680f5370a/1000x1000-000000-80-0-0.jpg",
[1] => :"https://website.net/images/d4e1eb3be395e1545a1a6e841d3eb63c/1000x1000-000000-80-0-0.jpg",
[2] => :"https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg",
[3] => :"https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg",
[4] => :"https://website.net/images/ced16733944378217630f613c277f34a/1000x1000-000000-80-0-0.jpg",
[5] => :"https://website.net/images/74160d6a4681c101268f64451847b0d7/1000x1000-000000-80-0-0.jpg",
)
)
[0] bevat de ruwe matches: van begin tot eind van je reguliere expressie.
in jouw reguliere expressie staat iets tussen kromme haakjes. (.*)
Per blokje tussen die haakjes krijg je een match. Die vind je in [1], [2] etc.
Maar aangezien jij maar 1 set haakjes hebt, heb jij alleen [1].
Aandacht gaat nu uit naar de matches, dus we kijken naar $titles[1].
daar blijkt dat we in het document 6x een match hadden.
Jouw interesse ging uit naar het 3e plaatje, dus hebben we nummer [2] nodig (we beginnen immers bij 0 te tellen).
Dus
Daar zat hem het hem in, nu begrijp ik ook de andere uitleg op die eerder voorbij kwam, php.net, moest daar echt goed begrijpen hoe dat werkte maar ja nu zie ik het.
super leuk en ontzettend bedankt!!!
echt alle dank voor de hulp en het werkt erg mooi, ik kan een foto uit album nu perfect als pic grabben zeg maar.
Maar als ik opdracht wil geven om dit plaatje elke x seconde op nieuw te laden, althans het plaatje niet zelf maar de source ervan.... hoe werkt dit?
Een plaatje verversen werkt wel, daarvoor geef ik een eerdere code mee, maar ik denk, correct me if ik zit fout. dat het plaatjes idd verfrest en niet het PHP script zelf, daardoor word steeds dezelfde plaatje getoond, denk ik.
met:
Code (php)
1
2
3
4
2
3
4
<?php
preg_match_all('/"picture"(.*?)"title"/', $file_string, $titles);
echo '<pre>' . print_r($titles, 1) . '</pre>';
?>
preg_match_all('/"picture"(.*?)"title"/', $file_string, $titles);
echo '<pre>' . print_r($titles, 1) . '</pre>';
?>
word perfect het plaatje weergeven, maar hoe krijg ik het zo voor elkaar dat dit x seconden het script opnieuw kijkt of de source een ander plaatje heeft?
Daar had ik eerst een soort van java scriptje voor maar ik denkt dat deze alleen het bestaande plaatje herlaad en niet het script zelf, klopt dat?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script language="javascript">
function updateImage() {
obj = document.imagename;
obj.src = obj.src.split("?")[0] + "?" + new Date().getTime();
//Following statement sets the delay before the function will
//call itself again (in milliseconds)
setTimeout("updateImage()",3000);
}
</script>
function updateImage() {
obj = document.imagename;
obj.src = obj.src.split("?")[0] + "?" + new Date().getTime();
//Following statement sets the delay before the function will
//call itself again (in milliseconds)
setTimeout("updateImage()",3000);
}
</script>
Wel met een nieuw getal erachter om werkelijk herladen te forceren.
Maar als plaatje.jpg zelf niet verandert, dan zal plaatje.jpg?133434343 en daarna plaatje.jpg?4324343 steeds hetzelfde tonen.
Dit zou je aan kunnen pakken door
<img src="plaatjelader.php"> te gebruiken, en dan kun je in php steeds opnieuw dat plaatje / een nieuw plaatje proberen op te halen.
Maar dat heeft nog wel een aantal "specials" met headers en dergelijke nodig.
Bedoel je ermee dat ik een plaatjelader.php maak, en daarin de plaats
Code (php)
1
2
3
4
2
3
4
<?php
preg_match_all('/"picture"(.*?)"title"/', $file_string, $titles);
echo '<pre>' . print_r($titles, 1) . '</pre>';
?>
preg_match_all('/"picture"(.*?)"title"/', $file_string, $titles);
echo '<pre>' . print_r($titles, 1) . '</pre>';
?>
deze laden refreshen, begrijp ik dat goed?
Er zijn een paar mogelijkheden.
De lompste is om de hele huidige pagina te verversen. Maar dat is irritant voor de gebruiker.
Alternatieven zijn om alleen het plaatjes te vervangen. En dan is denk ik het gemakkelijkste om alleen de url van de afbeelding op te vragen.
Dat kan met een ajax call.
Ik werk met jQuery en dan zou dat gaan met:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<img id="hetplaatje" src="https://website.net/images/ed1c6a82f77ff8db8bfd19f370dc9c8e/1000x1000-000000-80-0-0.jpg" >
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
function refresh_my_image() {
$.ajax({
cache: false,
type: 'GET',
dataType: 'json',
url: 'JOUW_URL/getplaatje3.php',
success: function (data)
{
// alert om te zien wat opgehaald is
alert('plaatje: ' + data.plaatje);
$('#hetplaatje').attr('src', data.plaatje);
}
});
}
setInterval(refresh_my_image, 5000);
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
function refresh_my_image() {
$.ajax({
cache: false,
type: 'GET',
dataType: 'json',
url: 'JOUW_URL/getplaatje3.php',
success: function (data)
{
// alert om te zien wat opgehaald is
alert('plaatje: ' + data.plaatje);
$('#hetplaatje').attr('src', data.plaatje);
}
});
}
setInterval(refresh_my_image, 5000);
</script>
Dit script roept elke 5 seconden een url aan naar het script getplaatje3.php
Dat script moet de juiste url oplepelen en teruggeven.
Dat is grotendeels het eerdere script, maar dan moet hij alleen die ene url teruggeven (als json)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Topic gesloten na onnodig inmiddels verwijderd spambericht