PHP Parse data dari halaman [duplikat]

Oct 16 2020

Turunkan skrip saya, saya mencoba mendapatkan yang disebut "UUID" tetapi saya mendapatkan 2 kesalahan, jika Anda baru saja masuk ke halaman, debug menunjukkan kesalahan:

Perhatikan: Undefined index: nama pada baris 6

jika saya mengklik tombol untuk mendapatkan info dari nilai sebagai contoh "TheChuckNorris007 Resident" saya mendapatkan kesalahan:

Kesalahan fatal: Kesalahan Tidak Tertangkap: Panggilan ke pemisahan fungsi yang tidak ditentukan di n2k1.php: 51 Pelacakan tumpukan: # 0 n2k1.php (17): name2Key ('TheChuckNorris0 ...') # 1 {main} dimasukkan ke baris 51.

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

Jika Anda scroll ke bawah, Anda akan menemukan h3 dengan nama TheChuckNorris007

html:

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

Saya ingin menggemakan bagian yang berani: https://world.secondlife.com/resident/**50374d97-060b-4b35-b1cc-4967dadca9c4**

File Php saya:

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

Terima kasih sebelumnya.

Jawaban

DmytroHuz Oct 16 2020 at 18:31

Anda tidak memiliki $ _GET ["name"]; pada pemuatan pertama. Anda harus memeriksanya seperti ini:

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

ATAU

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

Bagaimana dengan kesalahan kedua: alih-alih split()menggunakan explode() Referensi

mickmackusa Nov 15 2020 at 00:00

Saya sarankan untuk memisahkan logika pemrosesan dan logika pencetakan Anda - ini akan meningkatkan keterbacaan kode Anda. Anda juga harus lebih memperhatikan tabbing. Jangan gunakan <font>tag untuk menerapkan gaya - idealnya, Anda menginginkan tag sesedikit yang diperlukan. Gunakan css untuk mengatur gaya dokumen Anda. Dalam sebagian besar kasus, jika Anda mengambil data dari dokumen html yang valid, Anda harus menggunakan pengurai DOM untuk mengisolasi nilai tag / atribut yang Anda inginkan. Setelah Anda mendapatkan teks target, maka Anda harus mengeluarkan mesin regex.

  1. Tentang $_GET['name']kesalahan ... Anda ingin memeriksa apakah itu dideklarasikan dan bukan string panjang-nol. Pemeriksaan langsung untuk itu !empty().

  2. split()bukanlah sebuah fungsi. Saya bahkan tidak bisa merekomendasikan menggantinya dengan explode(). Akan jauh lebih langsung untuk digunakan rawurlencode(). Preferensi pribadi saya adalah meneruskan array ke http_build_query().

Ini penyesuaian saya untuk skrip Anda. ( demo parsial )

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