genion18
Goto Top

PHP Werte auslesen und als Hyperlink geändert ausgeben

Hallöchen.

Folgendes, ich hab eine Userliste in MySql,

User_list
id user_name
1 hans
2 hubert

nun zu dem text/code:

<?PHP
$text "http://127.0.0.1/view_user.php?user_id=1 und http://127.0.0.1/view_user.php?user_id=2 geben sich die Hand."  

$group_typeb = get_numerics($text);
	
for ($i=0;$i < count($group_typeb);$i++){
if (strpos($text, "view_user.php?user_id=") !== false) {  
if ($row3id == $group_typeb[$i]){
}ELSE{
$sql = 'SELECT * FROM handle_user WHERE id = "'.$group_typeb[$i].'"';  
foreach ($pdo->query($sql) as $row3) {
$text = str_replace("view_user.php?user_id=".$row3['id'], "<a href="view_user.php?user_id=".$row3['id']."'>".$row3['handle']."</a>", $text);  
$row3id = $row3['id'];  
}} 
}
}
?>
wird hierüber ausgelesen und gibt hyperlinks mit den namen in html aus, was auch soweit funktioniert.
(<a href"view_user.php?user_id=1>Hans</a> gibt <a href"view_user.php?user_id=2>hubert</a> die Hand)<-als hyperlink

das problem an dem script ist nur, wenn der link mehrmals im Text vorkommt, dann gibt er mehrmals "<a href="view_user.php?user_id=".$row3['id']."'>".$row3['handle']."</a>" hintereinander aus und die schleife dauert ewig bis er es generiert hat.

jetzt meine Frage, ist es kleiner oder besser lösbar als über die schleife (for ($i=0;$i < count($group_typeb);$i++){)?

greets

Content-ID: 671923

Url: https://administrator.de/forum/php-werte-auslesen-und-als-hyperlink-geaendert-ausgeben-671923.html

Ausgedruckt am: 13.03.2025 um 19:03 Uhr

Cubic83
Cubic83 13.03.2025 um 17:26:22 Uhr
Goto Top
Hallo,

ich steh vielleicht gerade auf dem Schlauch. Aber ich verstehe nicht was du vor hast.
Was ist $text und was ist get_numerics? Das scheint mir eine Funktion von dir selbst zu sein?

Kannst du vielleicht noch mehr details geben?

Ist $text die aufgerufene URL?
$text "http://127.0.0.1/view_user.php?user_id=1 und http://127.0.0.1/view_user.php?user_id=2 geben sich die Hand."  
ist auch komisch.

Ich nehme an du hast den code für uns vereinfacht - das macht es aber irgendwie nicht einfacher ;)

mfG
Cubic83
Cubic83 13.03.2025 aktualisiert um 18:17:36 Uhr
Goto Top
Also ich habe mir den Code jetzt mal genauer angeschaut und 1 zu 1 umgesetzt. und durch ChatGPT verbessern lassen. von ihm kommt der Ansatz mit der parseURL.

$finaltext = "";  
$explode   = explode("http://", $text);  
$Cache = [];

for ($i = 0; $i < count($explode); $i++) {
    if (strpos($explode[$i], " ") !== false) {  
        $link = substr($explode[$i], 0, strpos($explode[$i], " "));  
        
        // Extrahiere UserID aus URL
        $urlParts = parse_url("http://".$explode[$i]);  
        parse_str($urlParts['query'], $queryParams);  
        $UserID = $queryParams['user_id'] ?? null;  

        if ($UserID) {
            // Prüfen, ob die UserID bereits im Cache ist
            $foundKey = array_search($UserID, array_column($Cache, 'UserID'));  
            
            if ($foundKey !== false) {
                // Name aus dem Cache verwenden
                $Databasename = $Cache[$foundKey]['UserName'];  
            } else {
                // Name aus der Datenbank holen
                // $SQL = "SELECT name FROM table WHERE id = $UserID" 
                $Databasename = "Beispielname"; // Hier simuliert  
                
                // Im Cache speichern
                $Cache[] = array("UserID" => $UserID, "UserName" => $Databasename);  
            }

            $finaltext .= str_replace(
                $link, 
                '<a href="view_user.php?user_id=' . $UserID . '">' . $Databasename . '</a>',   
                $explode[$i]
            );
        }
    }
}

Ich habe den Code nicht getestet aber der ansatz scheint mir gut. Es sei den hinter $text hängt noch ein riesen Rattenschwanz den wir nicht kennen.


EDIT: Um den Cache teil erweiter...
mfG
genion18
genion18 13.03.2025 aktualisiert um 18:44:05 Uhr
Goto Top
Hallöchen,

ganz einfach ausgedrückt.

im Text steht z.b. http://127.0.0.1/view_user.php?user_id=1

er nimmt mit $group_typeb = get_numerics($text); alles auseinander für
for ($i=0;$i < count($group_typeb);$i++){

dies überprüft dann if (strpos($text, "view_user.php?user_id=") !== false) { ob der text vorhanden ist
wenn ja, ließt er in der datenbank die Zahl (sprich die ID" aus) und gibt es dann mit Namen:

<a href="view_user.php?user_id=1'>hans</a>

aus.

das problem ist wie geschrieben, wenn mehrmals z.b. http://127.0.0.1/view_user.php?user_id=1 angegeben wird gibt er mehrmals den Namen aus hintereinnder und das die schleife eine gute Zeit zum ändern brauch.

deshalb die Frage ob man sowas eleganter lösen kann.

greets
genion18
genion18 13.03.2025 aktualisiert um 18:59:32 Uhr
Goto Top
hallöchen,

nur stell ich mir die frage, woher er bei

parse_str($urlParts['query'], $queryParams);

das ['query'] beziehen soll?

bekomm nur die meldung: Warning: Undefined array key "query" in D:\wep\htdocs\texttourl.php on line 19

greets
Cubic83
Cubic83 13.03.2025 aktualisiert um 19:12:02 Uhr
Goto Top
das sollte durch die Funktion parse_url automatisch kommen.

https://www.php.net/manual/en/function.parse-url.php

Hier ist die Ausgabe des Scriptes mit deinem $text input.

<a href="view_user.php?user_id=1 und ">Beispielname</a> und <a href="view_user.php?user_id=2 geben sich die Hand.">Beispielname</a> geben sich die Hand.    

Welche Version von PHP nimmst du den?

Edit: Passt so nicht - ich muss da dann doch noch mal ran..... Gib mir ne Minute.
Cubic83
Cubic83 13.03.2025 um 19:17:43 Uhr
Goto Top
Hier ist der ganze Code:
<?PHP
$text = "http://127.0.0.1/view_user.php?user_id=1 und http://127.0.0.1/view_user.php?user_id=2 geben sich die Hand.";  

$finaltext = $text;  
$Cache = [];

// Regex zur Erkennung von URLs mit 'user_id' 
preg_match_all('/http:\/\/[^\s]+/', $text, $matches);  

foreach ($matches[0] as $link) {
    // Extrahiere UserID aus URL
    $urlParts = parse_url($link);  
    parse_str($urlParts['query'] ?? '', $queryParams);    
    $UserID = $queryParams['user_id'] ?? null;    

    if ($UserID) {
        // Prüfen, ob die UserID bereits im Cache ist
        $foundKey = array_search($UserID, array_column($Cache, 'UserID'));    
        
        if ($foundKey !== false) {
            // Name aus dem Cache verwenden
            $Databasename = $Cache[$foundKey]['UserName'];    
        } else {
            // Name aus der Datenbank holen
            $Databasename = "Beispielname"; // Hier simuliert    
            
            // Im Cache speichern
            $Cache[] = array("UserID" => $UserID, "UserName" => $Databasename);    
        }

        // Text sauber ersetzen
        $finaltext = str_replace(
            $link,
            '<a href="view_user.php?user_id=' . $UserID . '">' . $Databasename . '</a>',  
            $finaltext
        );
    }
}

echo $finaltext;
?>

Der Code funktioniert - Aber fairnesshalber: Credit geht jetzt komplett an Chatgpt ;)