php explode
ik heb een veld in een xml feed waar de volgende info instaat
<description>Start Van De Motor Set USB ID: 6F22683C19 Time: 30-10-2020 21:18:40 CET Engine Hours: 3083:27:00 </description>
nou wil ik het in de volgende stukken delen
tot aan Set USB (dit kan variable zijn)
gedeelte van SET USB tot aan Time
Gedeelte Time tot aan Engine
engine gedeelte
nou heb ik al geprobeerd dit met de volgende code te doen
$test01 = $item->description;
$result = explode("SET", $test01);
$result2 = explode("Time:", $test01);
$result3 = explode("Engine", $test01);
Maar dan krijg ik lege array's
waarschijnlijk gebruik ik ook niet de goede functie hiervoor maar zou niet weten welke ik het beste ervoor kan gebruiken
iemand die me beetje op weg kan helpen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$value = 'Start Van De Motor Set USB ID: 6F22683C19 Time: 30-10-2020 21:18:40 CET Engine Hours: 3083:27:00';
if(preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/',$value,$match)){
print_r($match);
/*
$match[1] => Start Van De Motor
$match[2] => ID: 6F22683C19
$match[3] => 30-10-2020 21:18:40 CET
$match[4] => Hours: 3083:27:00
*/
}
?>
$value = 'Start Van De Motor Set USB ID: 6F22683C19 Time: 30-10-2020 21:18:40 CET Engine Hours: 3083:27:00';
if(preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/',$value,$match)){
print_r($match);
/*
$match[1] => Start Van De Motor
$match[2] => ID: 6F22683C19
$match[3] => 30-10-2020 21:18:40 CET
$match[4] => Hours: 3083:27:00
*/
}
?>
Zelfs als het een description betreft, hierin staan allerhande specs die blijkbaar relevant zijn. Dat rechtvaardigt dan toch enige structuur. En als de spec van dit XML-document dan zodanig is dat je hier geen aparte velden voor in kunt voegen, dan kun je toch op zijn minst zorgen voor enige structuur in deze data? :/
De oplossing van @Rob zal overigens alleen werken als alle descriptions dit (precieze) format hebben.
Ook kleine variaties kun je nog wel opvangen (door ze optioneel te maken in de regex - door er een vraagteken achter te zetten; en zo zijn er nog wel meer mogelijkheden), maar dan wordt het langzamerhand wel een beetje "voodoo". Dan kun je inderdaad beter gaan kijken of je de data niet gewoon gestructureerder aangeleverd kunt krijgen (als je daar al invloed op hebt).
ik wil alleen de data hebben zodat ik wat meer met de data kan doen.
maar je hebt helemaal gelijk de structuur is niet zoals het hoort, maar daarom wilde ik ook de data eruit kunnen filteren.
Thomas van den Heuvel op 31/10/2020 13:18:43:
Voel me toch genoodzaakt om op te merken dat het hier een XML-feed betreft, en dan wordt alle data ongestructureerd in een enkel element geplempt. Dan heb je toch niet helemaal begrepen waar XML voor bedoeld is :s.
Zelfs als het een description betreft, hierin staan allerhande specs die blijkbaar relevant zijn. Dat rechtvaardigt dan toch enige structuur. En als de spec van dit XML-document dan zodanig is dat je hier geen aparte velden voor in kunt voegen, dan kun je toch op zijn minst zorgen voor enige structuur in deze data? :/
De oplossing van @Rob zal overigens alleen werken als alle descriptions dit (precieze) format hebben.
Zelfs als het een description betreft, hierin staan allerhande specs die blijkbaar relevant zijn. Dat rechtvaardigt dan toch enige structuur. En als de spec van dit XML-document dan zodanig is dat je hier geen aparte velden voor in kunt voegen, dan kun je toch op zijn minst zorgen voor enige structuur in deze data? :/
De oplossing van @Rob zal overigens alleen werken als alle descriptions dit (precieze) format hebben.
Toevoeging op 01/11/2020 13:22:41:
Rob Doemaarwat op 30/10/2020 23:40:10:
Ik zou dit met een regular expression doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$value = 'Start Van De Motor Set USB ID: 6F22683C19 Time: 30-10-2020 21:18:40 CET Engine Hours: 3083:27:00';
if(preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/',$value,$match)){
print_r($match);
/*
$match[1] => Start Van De Motor
$match[2] => ID: 6F22683C19
$match[3] => 30-10-2020 21:18:40 CET
$match[4] => Hours: 3083:27:00
*/
}
?>
$value = 'Start Van De Motor Set USB ID: 6F22683C19 Time: 30-10-2020 21:18:40 CET Engine Hours: 3083:27:00';
if(preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/',$value,$match)){
print_r($match);
/*
$match[1] => Start Van De Motor
$match[2] => ID: 6F22683C19
$match[3] => 30-10-2020 21:18:40 CET
$match[4] => Hours: 3083:27:00
*/
}
?>
ik krijg het niet helemaal voor elkaar
ik heb nu $test = (preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/',$item->description,$match));
// alleen om te testen
print_r($test);
print_r($match);
$test1 = $match[1];
$test2 = $match[2];
$test3 = $match[3];
$test4 = $match[4];
maar de array blijft leeg terwijl $item->description wel goed is.
Ik neem aan dat je met "de array blijft leeg" de $match bedoelt? Geef eens een exacte dump van $item->description (en voor de zekerheid toch ook maar van $match).
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
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
$xml = <<< XML
[code]<?xml version="1.0" encoding="utf-8"?>
<product>
<description>Start Van De Motor Set USB ID: 6F22683C19 Time: 30-10-2020 21:18:40 CET Engine Hours: 3083:27:00 </description>
</product>
XML;
$item = simplexml_load_string( $xml );
if( preg_match('/^(.*) Set USB ID: (.*) Time: (.*) Engine Hours: (.*)$/', $item->description, $match ) )
{
echo '<pre>' . print_r( $match, TRUE ) . '</pre>';
}
foreach ( $match as $key => $value )
{
echo $key . ' = ' . $value . '<br />';
}
?>
<?php
$test = preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/', $item->description, $match ) ;
// alleen om te testen
echo '<pre>' . print_r( $test, TRUE ) . '</pre>';
echo '<pre>' . print_r( $match, TRUE ) . '</pre>';
$test1 = $match[1];
$test2 = $match[2];
$test3 = $match[3];
$test4 = $match[4];
echo '<p>' .
$test1 . '<br >' .
$test2 . '<br />' .
$test3 . '<br />' .
$test4 .
'</p>';
?>
$xml = <<< XML
[code]<?xml version="1.0" encoding="utf-8"?>
<product>
<description>Start Van De Motor Set USB ID: 6F22683C19 Time: 30-10-2020 21:18:40 CET Engine Hours: 3083:27:00 </description>
</product>
XML;
$item = simplexml_load_string( $xml );
if( preg_match('/^(.*) Set USB ID: (.*) Time: (.*) Engine Hours: (.*)$/', $item->description, $match ) )
{
echo '<pre>' . print_r( $match, TRUE ) . '</pre>';
}
foreach ( $match as $key => $value )
{
echo $key . ' = ' . $value . '<br />';
}
?>
<?php
$test = preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/', $item->description, $match ) ;
// alleen om te testen
echo '<pre>' . print_r( $test, TRUE ) . '</pre>';
echo '<pre>' . print_r( $match, TRUE ) . '</pre>';
$test1 = $match[1];
$test2 = $match[2];
$test3 = $match[3];
$test4 = $match[4];
echo '<p>' .
$test1 . '<br >' .
$test2 . '<br />' .
$test3 . '<br />' .
$test4 .
'</p>';
?>
Toevoeging op 01/11/2020 14:03:56:
De code tag in regel 3 hoort daar niet.
Die wordt door de forum software toegevoegd.
Gewijzigd op 01/11/2020 14:02:41 door Adoptive Solution
https://www.site.com/user_rss_feed.php dit is de link die ik ophaal alleen moet je inloggen om het te zien dus zie user_rss_feed.php.xml voor wat ik op het scherm krijg.
@Adoptive Solution deze code werkt goed maar niet als ik de link erin verwerk dan krijg ik +
Warning: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found in /httpdocs/power/feed.php on line 49
Warning: simplexml_load_string(): https://www.site.com/user_rss_feed.php in /httpdocs/power/feed.php on line 49
Warning: simplexml_load_string(): ^ in httpdocs/power/feed.php on line 49
@Adoptive Solution deze code werkt goed maar niet als ik de link erin verwerk dan krijg ik +
Warning: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found in /httpdocs/power/feed.php on line 49
Warning: simplexml_load_string(): https://www.site.com/user_rss_feed.php in /httpdocs/power/feed.php on line 49
Warning: simplexml_load_string(): ^ in httpdocs/power/feed.php on line 49
Gewijzigd op 02/11/2020 11:39:30 door Michael vanDijk
Error zegt het al, de start-tag begint niet met <. Ik gok dat je de UBB-tags meeneemt?
@Michael mogelijk komt dat omdat het codeblok hierboven foutief een [code] tag invoegt op regel 3. Als je deze verwijdert lijkt het wel/beter te werken.
Thomas van den Heuvel op 01/11/2020 15:08:07:
@Michael mogelijk komt dat omdat het codeblok hierboven foutief een [code] tag invoegt op regel 3. Als je deze verwijdert lijkt het wel/beter te werken.
die had ik netjes verwijderd..
ik denk dat het komt omdat het een .php bestand is die ik ophaal die een xml output ?
Dan weet je wat er in zit.
het zit hem in $item = simplexml_load_string( $url );
want als ik hem echo dan krijg ik de link te zien...
simplexml_load_string moet iets zijn die een bestand kan lezen niet string?
Gewijzigd op 02/11/2020 11:38:34 door Michael vanDijk
Of gebruik cURL wat flexibeler is.
Gewijzigd op 02/11/2020 10:23:48 door - Ariën -
$url = '';
$context = stream_context_create(array('http' => array('header' => 'Accept: application/xml')));
$rss = Feed::loadRss($url, $user, $pass);
$xml = file_get_contents($url, false, $context);
$item = simplexml_load_file( $xml );
ik ga ff testen met curl
Toevoeging op 02/11/2020 10:42:12:
Warning: simplexml_load_file(https://www.site.com/user_rss_feed.php): failed to open stream: HTTP request failed! HTTP/1.0 401 Unknown infeed.php on line 13
Gewijzigd op 02/11/2020 11:38:18 door Michael vanDijk
Gewijzigd op 02/11/2020 10:57:42 door - Ariën -
Gewijzigd op 02/11/2020 11:37:40 door Michael vanDijk
Echo eens wat er in $data zit?
Gewijzigd op 02/11/2020 11:37:52 door Michael vanDijk
Gewijzigd op 02/11/2020 11:41:32 door - Ariën -
ik krijg nu deze output :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
SimpleXMLElement Object
(
[@attributes] => Array
(
[version] => 2.0
)
[channel] => SimpleXMLElement Object
(
[title] => site
[link] => http://www.site.com/
[description] => site Events RSS Feed
[pubDate] => Mon, 02 Nov 2020 10:36:17 +0000
[lastBuildDate] => Mon, 02 Nov 2020 10:36:17 +0000
[ttl] => 5
[item] => Array
(
[0] => SimpleXMLElement Object
(
[title] => 150-006 XAS: 150-006 XAS - Fuel Monitor Event End Fill 48%
[description] => Fuel Monitor Event End Fill 48%
Set USB ID: 6F22683C19
Time: 02-11-2020 11:29:05 CET
Engine Hours: 3137:24:00
[pubDate] => Mon, 02 Nov 2020 10:29:05 +0000
[enclosure] => SimpleXMLElement Object
(
[@attributes] => Array
(
[url] => http://www.site.com/style/default/logo.png
[length] => 1465
[type] => image/png
)
)
[alertColour] => http://www.site.com/style/default/logo.png
)
[1] => SimpleXMLElement Object
(
[title] => 150-006 XAS: 150-006 XAS - Fuel Monitor Event Start Fill 47%
[description] => Fuel Monitor Event Start Fill 47%
Set USB ID: 6F22683C19
Time: 02-11-2020 11:29:04 CET
Engine Hours: 3137:24:00
[pubDate] => Mon, 02 Nov 2020 10:29:04 +0000
[enclosure] => SimpleXMLElement Object
(
[@attributes] => Array
(
[url] => http://www.site.com/style/default/logo.png
[length] => 1465
[type] => image/png
)
)
[alertColour] => http://www.site.com/style/default/logo.png
)
(
[@attributes] => Array
(
[version] => 2.0
)
[channel] => SimpleXMLElement Object
(
[title] => site
[link] => http://www.site.com/
[description] => site Events RSS Feed
[pubDate] => Mon, 02 Nov 2020 10:36:17 +0000
[lastBuildDate] => Mon, 02 Nov 2020 10:36:17 +0000
[ttl] => 5
[item] => Array
(
[0] => SimpleXMLElement Object
(
[title] => 150-006 XAS: 150-006 XAS - Fuel Monitor Event End Fill 48%
[description] => Fuel Monitor Event End Fill 48%
Set USB ID: 6F22683C19
Time: 02-11-2020 11:29:05 CET
Engine Hours: 3137:24:00
[pubDate] => Mon, 02 Nov 2020 10:29:05 +0000
[enclosure] => SimpleXMLElement Object
(
[@attributes] => Array
(
[url] => http://www.site.com/style/default/logo.png
[length] => 1465
[type] => image/png
)
)
[alertColour] => http://www.site.com/style/default/logo.png
)
[1] => SimpleXMLElement Object
(
[title] => 150-006 XAS: 150-006 XAS - Fuel Monitor Event Start Fill 47%
[description] => Fuel Monitor Event Start Fill 47%
Set USB ID: 6F22683C19
Time: 02-11-2020 11:29:04 CET
Engine Hours: 3137:24:00
[pubDate] => Mon, 02 Nov 2020 10:29:04 +0000
[enclosure] => SimpleXMLElement Object
(
[@attributes] => Array
(
[url] => http://www.site.com/style/default/logo.png
[length] => 1465
[type] => image/png
)
)
[alertColour] => http://www.site.com/style/default/logo.png
)
met deze code
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
include_once "src/Feed.php";
$user = "user";
$pass = "pass";
$servername = "localhost";
$username = "user";
$password = "pass";
$dbname = "user";
$usernamehttp = 'user';
$passwordhttp = 'pass';
$url = "https://www.site.com/user_rss_feed.php";
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
$data = simplexml_load_string( $data );
foreach ($data->channel as $item) {
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$check_timestamp = ("SELECT * FROM 'feed' WHERE timestamp = '" . (int)$item->timestamp . "' LIMIT 1");
echo "<pre>";
print_r($data);
echo "</pre>";
//$check_timestamp = SELECT * FROM feed WHERE timestamp =''. $item->timestamp. '' LIMIT 1;
if ($check_timestamp < 1) {
echo "er is al een timestamp aanwezig<br />";
}
else {
//echo "er is nog geen timestamp aanwezig<br />";
$value = $item->description;
preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/i', $value, $match);
$test1 = $match[1];
$test2 = $match[2];
$test3 = $match[3];
$test4 = $match[4];
$sql = "INSERT INTO feed (timestamp, title, description, match1, match2, match3, match4)
VALUES ('". $item->timestamp ."', '". $item->title ."', '". $item->description ."', '". $test1 ."', '". $test2 ."', '". $test3 ."', '". $test4 ."')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully<br />";
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
$conn->close();
}
}
}
$item = simplexml_load_string( $data );
if( preg_match('/^(.*) Set USB ID: (.*) Time: (.*) Engine Hours: (.*)$/', $item->description, $match ) )
{
echo '<pre>' . print_r( $match, TRUE ) . '</pre>';
}
foreach ( $match as $key => $value )
{
echo $key . ' = ' . $value . '<br />';
}
$test = preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/', $item->description, $match ) ;
// alleen om te testen
echo '<pre>' . print_r( $test, TRUE ) . '</pre>';
echo '<pre>' . print_r( $match, TRUE ) . '</pre>';
$test1 = $match[1];
$test2 = $match[2];
$test3 = $match[3];
$test4 = $match[4];
echo '<p>' .
$test1 . '<br >' .
$test2 . '<br />' .
$test3 . '<br />' .
$test4 .
'</p>';
?>
include_once "src/Feed.php";
$user = "user";
$pass = "pass";
$servername = "localhost";
$username = "user";
$password = "pass";
$dbname = "user";
$usernamehttp = 'user';
$passwordhttp = 'pass';
$url = "https://www.site.com/user_rss_feed.php";
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
$data = simplexml_load_string( $data );
foreach ($data->channel as $item) {
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$check_timestamp = ("SELECT * FROM 'feed' WHERE timestamp = '" . (int)$item->timestamp . "' LIMIT 1");
echo "<pre>";
print_r($data);
echo "</pre>";
//$check_timestamp = SELECT * FROM feed WHERE timestamp =''. $item->timestamp. '' LIMIT 1;
if ($check_timestamp < 1) {
echo "er is al een timestamp aanwezig<br />";
}
else {
//echo "er is nog geen timestamp aanwezig<br />";
$value = $item->description;
preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/i', $value, $match);
$test1 = $match[1];
$test2 = $match[2];
$test3 = $match[3];
$test4 = $match[4];
$sql = "INSERT INTO feed (timestamp, title, description, match1, match2, match3, match4)
VALUES ('". $item->timestamp ."', '". $item->title ."', '". $item->description ."', '". $test1 ."', '". $test2 ."', '". $test3 ."', '". $test4 ."')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully<br />";
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
$conn->close();
}
}
}
$item = simplexml_load_string( $data );
if( preg_match('/^(.*) Set USB ID: (.*) Time: (.*) Engine Hours: (.*)$/', $item->description, $match ) )
{
echo '<pre>' . print_r( $match, TRUE ) . '</pre>';
}
foreach ( $match as $key => $value )
{
echo $key . ' = ' . $value . '<br />';
}
$test = preg_match('/^(.*) Set USB (.*) Time: (.*) Engine (.*)$/', $item->description, $match ) ;
// alleen om te testen
echo '<pre>' . print_r( $test, TRUE ) . '</pre>';
echo '<pre>' . print_r( $match, TRUE ) . '</pre>';
$test1 = $match[1];
$test2 = $match[2];
$test3 = $match[3];
$test4 = $match[4];
echo '<p>' .
$test1 . '<br >' .
$test2 . '<br />' .
$test3 . '<br />' .
$test4 .
'</p>';
?>
nou is alleen het "probleem"dat ik keek in de database of timestamp bestond en zo wist dat er al een record was..
nu krijg ik die niet meer mee...
daarentegen krijg ik wel pubdate.
maar moet ik die dan eerst omzetten om daar een goede datum van te krijgen ?
Toevoeging op 02/11/2020 11:45:37:
- Ariën - op 02/11/2020 11:40:45:
Geef even de output van $data. Dit moet een XML-feed zijn. Verder is het ook ongewenst om halverwege een bericht weg te editen.
sorry ik wilde het overzichtelijk houden met welke code er nu is, daarom had ik een nieuwe post gemaakt met wat ik nu heb totaal en de output zoals hij nu is ;-) zal het niet meer doen
Gewijzigd op 02/11/2020 11:46:29 door Michael vanDijk