ajicles Posted July 15, 2010 Share Posted July 15, 2010 I need help again with preg match and trying to grab text between two xml tags. And it doesn't return anything back to be I tried adding /s to my pattern for the multi line thing. I am new and getting better at what the patterns mean and stuff. Thanks ~ AJ Code: $server = "68.168.98.191"; $port = "13511"; $password = "********"; $fp = fsockopen("$server", $port, $errno, $errstr, 30); fputs($fp, "GET /admin.cgi?pass=".$password."&mode=viewxml HTTP/1.0\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)\r\n\r\n"); while (!feof($fp)) { $content = fgets($fp); } //echo $content; function getTextBetweenTags($string, $tagname) { $pattern = "/<songtitle>(.*?)<\/songtitle>/s"; preg_match($pattern, $content, $matches); return $matches[1]; } Echo Content Returns: <?xml version="1.0" standalone="yes" ?><!DOCTYPE SHOUTCASTSERVER [<!ELEMENT SHOUTCASTSERVER (CURRENTLISTENERS,PEAKLISTENERS,MAXLISTENERS,REPORTEDLISTENERS,AVERAGETIME,SERVERGENRE,SERVERURL,SERVERTITLE,SONGTITLE,SONGURL,IRC,ICQ,AIM,WEBHITS,STREAMHITS,STREAMSTATUS,BITRATE,CONTENT,VERSION,WEBDATA,LISTENERS,SONGHISTORY)><!ELEMENT CURRENTLISTENERS (#PCDATA)><!ELEMENT PEAKLISTENERS (#PCDATA)><!ELEMENT MAXLISTENERS (#PCDATA)><!ELEMENT REPORTEDLISTENERS (#PCDATA)><!ELEMENT AVERAGETIME (#PCDATA)><!ELEMENT SERVERGENRE (#PCDATA)><!ELEMENT SERVERURL (#PCDATA)><!ELEMENT SERVERTITLE (#PCDATA)><!ELEMENT SONGTITLE (#PCDATA)><!ELEMENT SONGURL (#PCDATA)><!ELEMENT IRC (#PCDATA)><!ELEMENT ICQ (#PCDATA)><!ELEMENT AIM (#PCDATA)><!ELEMENT WEBHITS (#PCDATA)><!ELEMENT STREAMHITS (#PCDATA)><!ELEMENT STREAMSTATUS (#PCDATA)><!ELEMENT BITRATE (#PCDATA)><!ELEMENT CONTENT (#PCDATA)><!ELEMENT VERSION (#PCDATA)><!ELEMENT WEBDATA (INDEX,LISTEN,PALM7,LOGIN,LOGINFAIL,PLAYED,COOKIE,ADMIN,UPDINFO,KICKSRC,KICKDST,UNBANDST,BANDST,VIEWBAN,UNRIPDST,RIPDST,VIEWRIP,VIEWXML,VIEWLOG,INVALID)><!ELEMENT INDEX (#PCDATA)><!ELEMENT LISTEN (#PCDATA)><!ELEMENT PALM7 (#PCDATA)><!ELEMENT LOGIN (#PCDATA)><!ELEMENT LOGINFAIL (#PCDATA)><!ELEMENT PLAYED (#PCDATA)><!ELEMENT COOKIE (#PCDATA)><!ELEMENT ADMIN (#PCDATA)><!ELEMENT UPDINFO (#PCDATA)><!ELEMENT KICKSRC (#PCDATA)><!ELEMENT KICKDST (#PCDATA)><!ELEMENT UNBANDST (#PCDATA)><!ELEMENT BANDST (#PCDATA)><!ELEMENT VIEWBAN (#PCDATA)><!ELEMENT UNRIPDST (#PCDATA)><!ELEMENT RIPDST (#PCDATA)><!ELEMENT VIEWRIP (#PCDATA)><!ELEMENT VIEWXML (#PCDATA)><!ELEMENT VIEWLOG (#PCDATA)><!ELEMENT INVALID (#PCDATA)><!ELEMENT LISTENERS (LISTENER*)><!ELEMENT LISTENER (HOSTNAME,USERAGENT,UNDERRUNS,CONNECTTIME, POINTER, UID)><!ELEMENT HOSTNAME (#PCDATA)><!ELEMENT USERAGENT (#PCDATA)><!ELEMENT UNDERRUNS (#PCDATA)><!ELEMENT CONNECTTIME (#PCDATA)><!ELEMENT POINTER (#PCDATA)><!ELEMENT UID (#PCDATA)><!ELEMENT SONGHISTORY (SONG*)><!ELEMENT SONG (PLAYEDAT, TITLE)><!ELEMENT PLAYEDAT (#PCDATA)><!ELEMENT TITLE (#PCDATA)>]><SHOUTCASTSERVER><CURRENTLISTENERS>0</CURRENTLISTENERS><PEAKLISTENERS>1</PEAKLISTENERS><MAXLISTENERS>50000</MAXLISTENERS><REPORTEDLISTENERS>0</REPORTEDLISTENERS><AVERAGETIME>1</AVERAGETIME><SERVERGENRE>Rock</SERVERGENRE><SERVERURL>http://www.listen2myradio.com/</SERVERURL><SERVERTITLE>Ajicles Radio</SERVERTITLE><SONGTITLE>Down With Webster - Rich Girl$</SONGTITLE><SONGURL></SONGURL><IRC>#shoutcast</IRC><ICQ>0</ICQ><AIM>N/A</AIM><WEBHITS>51</WEBHITS><STREAMHITS>2</STREAMHITS><STREAMSTATUS>1</STREAMSTATUS><BITRATE>96</BITRATE><CONTENT>audio/mpeg</CONTENT><VERSION>1.9.8</VERSION><WEBDATA><INDEX>8</INDEX><LISTEN>0</LISTEN><PALM7>0</PALM7><LOGIN>0</LOGIN><LOGINFAIL>0</LOGINFAIL><PLAYED>0</PLAYED><COOKIE>0</COOKIE><ADMIN>0</ADMIN><UPDINFO>8</UPDINFO><KICKSRC>0</KICKSRC><KICKDST>0</KICKDST><UNBANDST>0</UNBANDST><BANDST>0</BANDST><VIEWBAN>0</VIEWBAN><UNRIPDST>0</UNRIPDST><RIPDST>0</RIPDST><VIEWRIP>0</VIEWRIP><VIEWXML>33</VIEWXML><VIEWLOG>0</VIEWLOG><INVALID>2</INVALID></WEBDATA><LISTENERS></LISTENERS><SONGHISTORY><SONG><PLAYEDAT>1279206492</PLAYEDAT><TITLE>Down With Webster - Rich Girl$</TITLE></SONG><SONG><PLAYEDAT>1279206142</PLAYEDAT><TITLE>Swedish House Mafia - One - Original Mix</TITLE></SONG><SONG><PLAYEDAT>1279205829</PLAYEDAT><TITLE>Aaren San - Apes From Space (Dirtyloud Remix)</TITLE></SONG><SONG><PLAYEDAT>1279205509</PLAYEDAT><TITLE>Taio Cruz - Break Your Heart</TITLE></SONG><SONG><PLAYEDAT>1279205509</PLAYEDAT><TITLE>Down With Webster - Rich Girl$</TITLE></SONG><SONG><PLAYEDAT>1279205438</PLAYEDAT><TITLE>Swedish House Mafia - One - Original Mix</TITLE></SONG><SONG><PLAYEDAT>1279205124</PLAYEDAT><TITLE>Aaren San - Apes From Space (Dirtyloud Remix)</TITLE></SONG><SONG><PLAYEDAT>1279204920</PLAYEDAT><TITLE>Taio Cruz - Break Your Heart</TITLE></SONG></SONGHISTORY></SHOUTCASTSERVER> Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/ Share on other sites More sharing options...
salathe Posted July 15, 2010 Share Posted July 15, 2010 Your regular expression is case-sensitive meaning that the lowercase letters will not match the uppercase letters which are present in the XML. Either change the regex to have uppercase SONGTITLE or use the case-insensitive pattern modifier (/.../si) to match your pattern case-insensitively. Also, why are you using antiquated methods of a) retrieving the XML and b) accessing the SONGTITLE? Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/#findComment-1086329 Share on other sites More sharing options...
ajicles Posted July 15, 2010 Author Share Posted July 15, 2010 Its for Shoutcast radio and the XML and setting are behind a password protected area. Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/#findComment-1086610 Share on other sites More sharing options...
ajicles Posted July 15, 2010 Author Share Posted July 15, 2010 Yay, it works fantasic. Ill I had to is add the i in the pattern and remove the function because it wasn't working, because I tried to echo hello in it and it didn't return anything lol. $server = "68.168.98.191"; $port = "13511"; $password = ""; $fp = fsockopen("$server", $port, $errno, $errstr, 30); fputs($fp, "GET /admin.cgi?pass=".$password."&mode=viewxml HTTP/1.0\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)\r\n\r\n"); while (!feof($fp)) { $content = fgets($fp); } $pattern = "/<SONGTITLE>(.*?)<\/SONGTITLE>/si"; preg_match($pattern, $content, $matches); echo $matches[1]; Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/#findComment-1086619 Share on other sites More sharing options...
salathe Posted July 16, 2010 Share Posted July 16, 2010 I don't have a Shoutcast server to try this on but the following should, theoretically, also work*. Or at least show you an alternative approach should you want to use it. echo simplexml_load_file("http://68.168.98.191:13511/admin.cgi?pass=&mode=viewxml")->SONGTITLE; * Assuming of course that the SimpleXML extension is enabled and it can talk to that URL. Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/#findComment-1086983 Share on other sites More sharing options...
ajicles Posted July 17, 2010 Author Share Posted July 17, 2010 Well the only thing is it is a remote server and the xml is always changing with the new data. The .htaccess or something isn't allow to access it because it is a server talking to a server not a server talking to a client. So it disallows it to access it. Warning: simplexml_load_file(http://68.168.98.191:13511/admin.cgi?pass=&mode=viewxml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! ICY 404 Resource Not Found in D:\wamp\www\Radioo\xml test.php on line 3 Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://68.168.98.191:13511/admin.cgi?pass=&mode=viewxml" in D:\wamp\www\Radioo\xml test.php on line 3 Notice: Trying to get property of non-object in D:\wamp\www\Radioo\xml test.php on line 3 Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/#findComment-1087304 Share on other sites More sharing options...
salathe Posted July 17, 2010 Share Posted July 17, 2010 You could set the user_agent INI option, or provide a stream context for SimpleXML to use. The first just dictates the default user agent to send along, the second allows far more fine-grained control of the request. Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/#findComment-1087486 Share on other sites More sharing options...
ajicles Posted July 18, 2010 Author Share Posted July 18, 2010 You could set the user_agent INI option, or provide a stream context for SimpleXML to use. The first just dictates the default user agent to send along, the second allows far more fine-grained control of the request. Its a remote server and I can't edit anything on it. I am a noob at php lol. Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/#findComment-1087838 Share on other sites More sharing options...
salathe Posted July 19, 2010 Share Posted July 19, 2010 The changes that I mentioned are for your script, not the remote server. Link to comment https://forums.phpfreaks.com/topic/207794-preg-match/#findComment-1088044 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.