PHP Parse data from a page [duplicate]

Oct 16 2020

Giù è il mio script che sto cercando di ottenere il chiamato "UUID" ma ottengo 2 errori, se entri nella pagina il debug mostra l'errore:

Avviso: indice non definito: nome sulla riga 6

se faccio clic sul pulsante per ottenere le informazioni dal valore come esempio "TheChuckNorris007 Resident" ottengo l'errore:

Errore irreversibile: errore non rilevato: chiamata alla funzione non definita split () in n2k1.php: 51 Stack trace: # 0 n2k1.php (17): name2Key ('TheChuckNorris0 ...') # 1 {main} lanciata nella riga 51.

URL completo: https://search.secondlife.com/client_search.php?session=00000000-0000-0000-0000-000000000000&q=TheChuckNorris007+Resident

Se scorri verso il basso troverai un h3 con il nome TheChuckNorris007

html:

          <h3 class="result_title">
            <a href="https://world.secondlife.com/resident/50374d97-060b-4b35-b1cc-4967dadca9c4">
              
                TheChuckNorris007
              
            </a>
          </h3>

Voglio ripetere la parte in grassetto: https://world.secondlife.com/resident/**50374d97-060b-4b35-b1cc-4967dadca9c4**

il mio file Php:

<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;
    }
?>

Grazie a tutti in anticipo.

Risposte

DmytroHuz Oct 16 2020 at 18:31

Non hai $ _GET ["nome"]; al primo caricamento. Devi controllarlo in qualche modo in questo modo:

$username = "";
if(isset( $_GET["name"])){ $username = $_GET["name"];
}

O

$username = $_GET["name"]??"";

E il secondo errore: invece di split()usare explode() Reference

mickmackusa Nov 15 2020 at 00:00

Consiglio di separare la logica di elaborazione e la logica di stampa: ciò migliorerà la leggibilità del codice. Dovresti anche prestare maggiore attenzione alla tabulazione. Non utilizzare i <font>tag per applicare lo stile: idealmente, vuoi il minor numero di tag necessario. Usa css per definire lo stile del tuo documento. Nella grande maggioranza dei casi, se stai estraendo dati da un documento html valido, dovresti usare un parser DOM per isolare i valori di tag / attributo che desideri. Una volta acquisito il testo di destinazione, è opportuno rimuovere il motore di regex.

  1. Riguardo $_GET['name']all'errore ... Vuoi controllare se è dichiarato e non una stringa di lunghezza zero. Il controllo diretto per questo è !empty().

  2. split()non è una funzione. Non posso nemmeno raccomandare di sostituirlo con explode(). Sarebbe molto più diretto da usare rawurlencode(). La mia preferenza personale è passare un array a http_build_query().

Ecco il mio adattamento al tuo script. ( una demo parziale )

<?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"]);
}