<?php
/**
-* HTML parsing for the linksys router HTML pages
-*
-* PHP version 5
-*
-* @category Tools
-* @package linksys-wrt3g-tools
-* @author Christian Weiske <cweiske@cweiske.de>
-* @license AGPL v3
-* @link http://cweiske.de/linksys-wrt3g-tools.htm
-*/
+ * HTML parsing for the linksys router HTML pages
+ *
+ * PHP version 5
+ *
+ * @category Tools
+ * @package linksys-wrt3g-tools
+ * @author Christian Weiske <cweiske@cweiske.de>
+ * @license AGPL v3
+ * @link http://cweiske.de/linksys-wrt3g-tools.htm
+ */
class Wrt3g_HtmlParser
{
protected static $arTranslations = array(
'GPRS_MSG.ACQUIRING' => 'aquiring',
'GPRS_MSG.WWBEAR_GPRS' => 'GPRS',
'GPRS_MSG.WWBEAR_UMTS' => 'UMTS',
+ 'GPRS_MSG.GOOD' => 'good',
+ 'GPRS_MSG.EXCELLENT' => 'excellent',
+ 'GPRS_MSG.CTIME' => 'connection time',
+ 'GPRS_MSG.CFW' => 'card firmware',
+ 'GPRS_MSG.CMOD' => 'card model',
+ 'GPRS_MSG.CREV' => 'card revision',
+ 'GPRS_MSG.IMSI' => 'IMSI',
+ 'GPRS_MSG.SESSIONUSAGE' => 'session usage',
);
/**
- * Parses the body of /index_wstatus1.asp and returns extracted values.
- *
- * @param string $body HTML document to parse
- *
- * @return array Array of key-value pairs
- */
+ * Parses the body of /index_wstatus1.asp and returns extracted values.
+ *
+ * @param string $body HTML document to parse
+ *
+ * @return array Array of key-value pairs, probably with
+ * - "type"
+ * - "network"
+ * - "signal strength"
+ */
public function index_wstatus1($body)
{
- $arRetval = array();
+ $doc = new DomDocument();
+ $doc->loadHtml($body);
+ $xpath = new DOMXPath($doc);
+ $entries = $xpath->query('//table/tr/td');
+
$arMatches = array();
- preg_match_all('#>Capture\(([^)]+)\)</#', $body, $arMatches);
+ foreach ($entries as $entry) {
+ $s = $doc->saveXML($entry);
+ $s = str_replace(
+ array('<![CDATA[', ']]>'),
+ '', $s
+ );
+ $s = strip_tags($s);
+ //some strange utf8 space char
+ $s = str_replace("\xC2\xA0", ' ', $s);
+ $s = trim($s);
+ $s = str_replace(
+ array('Capture(', ') :'),
+ '', $s
+ );
+ if (substr($s, -1) == ')') {
+ $s = substr($s, 0, -1);
+ }
+ $arMatches[] = $s;
+ }
+
+
+ $arRetval = array();
$arData = array();
- reset($arMatches[1]);
- while (current($arMatches[1])) {
- $key = current($arMatches[1]);
- $value = next($arMatches[1]);
+ reset($arMatches);
+ while (current($arMatches)) {
+ $key = current($arMatches);
+ $value = next($arMatches);
if (isset(self::$arTranslations[$key])) {
$key = self::$arTranslations[$key];
}
$value = self::$arTranslations[$value];
}
$arRetval[$key] = $value;
- next($arMatches[1]);
+ next($arMatches);
}
return $arRetval;
/**
- * Parses the body of /index_wstatus2.asp and returns extracted values.
- *
- * @param string $body HTML document to parse
- *
- * @return array Array with "connection" as key and one of "connecting",
- * "connected" or "disconnected" as value.
- */
+ * Parses the body of /index_wstatus2.asp and returns extracted values.
+ *
+ * @param string $body HTML document to parse
+ *
+ * @return array Array with "connection" as key and one of "connecting",
+ * "connected" or "disconnected" as value.
+ */
public function index_wstatus2($body)
{
preg_match('/var status2 = "(.+)"/', $body, $arMatches);
+ if (!isset($arMatches[1])) {
+ return array();
+ }
$strStatus = $arMatches[1];
//Connecting
//Connected
return array('connection' => strtolower($strStatus));
}
+
+
+
+ /**
+ * Parses the HTML body of /Status_NoAuth.asp and returns the extracted
+ * values.
+ *
+ * @param string $body HTML document to parse
+ *
+ * @return array Array of key-value pairs with the following keys:
+ * - type
+ * - network
+ * - signal strength
+ * - connection time
+ * - session usage (array)
+ * - card model
+ * - card revision
+ * - card firmware
+ * - IMSI
+ *
+ * @todo FIXME implement "connection" value as index_wstatus2() does it
+ */
+ public function status_noauth($body)
+ {
+ $body = str_replace(
+ array(' ', '</font>', '<script>', '</script>'),
+ '', $body
+ );
+
+ $doc = new DomDocument();
+ libxml_use_internal_errors(true);//html is broken
+ $doc->loadHtml($body);
+ $xpath = new DOMXPath($doc);
+ $trs = $xpath->query('//table//table/tbody/tr');
+ $arRaw = array();
+ foreach ($trs as $tr) {
+ $titleItems = $xpath->query('td[@width=125]/text()', $tr);
+ $valueItems = $xpath->query('td[@width=296]/*[1]', $tr);
+ if ($titleItems->length && $valueItems->length) {
+ $title = substr($doc->saveXML($titleItems->item(0)), 8, -2);
+ $value = $doc->saveXML($valueItems->item(0));
+ $arRaw[self::$arTranslations[$title]] = $value;
+ }
+ }
+
+ foreach ($arRaw as $key => &$value) {
+ $value = trim(strip_tags($value));
+ if (substr($value, 0, 8) == 'Capture(') {
+ $value = self::$arTranslations[substr($value, 8, -1)];
+ }
+ }
+ unset($value);
+
+ if (isset($arRaw['connection time'])) {
+ $arRaw['connection time'] = str_replace(
+ array(
+ ' Capture(GPRS_MSG.HOURS)',
+ ' Capture(GPRS_MSG.MINUTE)',
+ ' Capture(GPRS_MSG.SECOND)',
+ ),
+ array(
+ 'h', 'm', 's'
+ ),
+ $arRaw['connection time']
+ );
+ }
+
+ if (isset($arRaw['session usage'])) {
+ $arS = explode(
+ 'TX = ',
+ str_replace('RX = ', '', $arRaw['session usage'])
+ );
+ $arRaw['session usage'] = array(
+ 'received' => $arS[0],
+ 'sent' => $arS[1]
+ );
+ }
+
+ return $arRaw;
+ }
}
\ No newline at end of file