PHP Analysiert Daten von einer Seite [Duplikat]
In meinem Skript versuche ich, die aufgerufene "UUID" zu erhalten, aber ich erhalte 2 Fehler. Wenn Sie nur die Seite eingeben, zeigt das Debug den Fehler an:
Hinweis: Undefinierter Index: Name in Zeile 6
Wenn ich auf die Schaltfläche klicke, um die Informationen aus dem Wert als Beispiel "TheChuckNorris007 Resident" abzurufen, wird folgende Fehlermeldung angezeigt:
Schwerwiegender Fehler: Nicht erfasster Fehler: Aufruf der undefinierten Funktion split () in n2k1.php: 51 Stapelverfolgung: # 0 n2k1.php (17): name2Key ('TheChuckNorris0 ...') # 1 {main} in Zeile 51.
Vollständige URL: https://search.secondlife.com/client_search.php?session=00000000-0000-0000-0000-000000000000&q=TheChuckNorris007+Resident
Wenn Sie nach unten scrollen, finden Sie ein h3 mit dem Namen TheChuckNorris007
html:
<h3 class="result_title">
<a href="https://world.secondlife.com/resident/50374d97-060b-4b35-b1cc-4967dadca9c4">
TheChuckNorris007
</a>
</h3>
Ich möchte den kühnen Teil wiederholen: https://world.secondlife.com/resident/**50374d97-060b-4b35-b1cc-4967dadca9c4** *
meine PHP-Datei:
<div align="center"><font size="-1"><font color="#000">
<?php
error_reporting(-1);
ini_set('display_errors', 'On');
$username = $_GET["name"];
if($username == "") { echo '<div align="center"><font size="-1"> <form action="n2k1.php" method="GET"> <input type="text" size="18" maxlength="40" value="TheChuckNorris007 Resident" name="name"> <br><input type="submit" value="lookup"> </form>'; } else { $uuid = name2Key($username); echo "<br>$uuid";
}
function getPage($web) { $html = "";
$ch = curl_init($web);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$html = curl_exec($ch);
if(curl_errno($ch)) { $html = "";
}
curl_close ($ch); return $html;
}
function getBetween($content,$start,$end) { $a1 = strpos($content,$start);
$content = substr($content,$a1 + strlen($start));
while($a2 = strrpos($content,$end)) { $content = substr($content,0,$a2);
}
return $content; } function name2Key($name)
{
$SL_SEARCH = 'http://search.secondlife.com/client_search.php?s=People&t=N&q='; $sName = split(' ',$name); $data = getPage($SL_SEARCH.$sName[0].'%20'.$sName[1]); $uuid = getBetween($data,'http://world.secondlife.com/resident/','"'); if(!preg_match("/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/",$uuid)) $uuid = '00000000-0000-0000-0000-000000000000';
return $uuid;
}
?>
Vielen Dank im Voraus.
Antworten
Sie haben nicht das $ _GET ["name"]; beim ersten Laden. Sie müssen es irgendwie so überprüfen:
$username = "";
if(isset( $_GET["name"])){ $username = $_GET["name"];
}
ODER
$username = $_GET["name"]??"";
Was ist mit dem zweiten Fehler: statt split()Verwendung explode() Referenz
Ich empfehle, Ihre Verarbeitungslogik und Ihre Drucklogik zu trennen - dies verbessert die Lesbarkeit Ihres Codes. Sie sollten auch dem Tabbing mehr Aufmerksamkeit schenken. Verwenden Sie keine <font>Tags, um das Styling anzuwenden. Idealerweise möchten Sie so wenige Tags wie nötig. Verwenden Sie CSS, um Ihr Dokument zu formatieren. In den allermeisten Fällen sollten Sie einen DOM-Parser verwenden, um die gewünschten Tag- / Attributwerte zu isolieren, wenn Sie Daten aus einem gültigen HTML-Dokument entfernen. Sobald Sie den Zieltext erfasst haben, sollten Sie die Regex-Engine ausschalten.
Über den
$_GET['name']Fehler ... Sie möchten überprüfen, ob er deklariert ist und keine Zeichenfolge mit der Länge Null. Die direkte Überprüfung dafür ist!empty().split()ist keine Funktion. Ich kann nicht einmal empfehlen, es durch zu ersetzenexplode(). Es wäre viel direkter zu verwendenrawurlencode(). Meine persönliche Präferenz ist es, ein Array an zu übergebenhttp_build_query().
Hier ist meine Anpassung an Ihr Skript. ( eine teilweise Demo )
<?php
function getContent($web) {
$ch = curl_init($web);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$html = curl_exec($ch);
if (curl_errno($ch)) { $html = "";
}
curl_close ($ch); return $html;
}
function getUUID($name) { $html = getContent(
'http://search.secondlife.com/client_search.php?'
. http_build_query([
's' => 'People',
't' => 'N',
'q' => $name ]) ); if ($html) {
$dom = new DOMDocument; $dom->loadHTML($html); $xpath = new DOMXPath($dom); foreach ($xpath->evaluate('//a[starts-with(@href, "https://world.secondlife.com/resident/")]') as $node) { if (preg_match("~https://world\.secondlife\.com/resident/\K[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}~", $node->getAttribute('href'), $m)) { return $m[0];
}
}
return '00000000-0000-0000-0000-000000000000';
}
}
if (empty($_GET["name"])) { ?><div> <form action="n2k1.php" method="GET"> <input type="text" size="18" maxlength="40" value="TheChuckNorris007 Resident" name="name"> <br> <input type="submit" value="lookup"> </form> </div><?php } else { echo getUUID($_GET["name"]);
}