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: 25.03.2025 um 18: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 ;)
bloodstix
bloodstix 15.03.2025 um 18:20:20 Uhr
Goto Top
Was willst du denn mit deinem Code überhaupt bezwecken? Ich hab schon sehr viel in der Praxis gesehen aber sowas noch nie. Wenn du mal genau sagen würdest was du da vorhast, könnte man dir mit ziemlicher Sicherheit eine elegante und effiziente Lösung bieten.
genion18
genion18 16.03.2025 aktualisiert um 12:52:53 Uhr
Goto Top
Hallöchen,

die Shoutbox und Teil eines CMS.

Das CMS besteht aus User, Gruppen und Events.

User_list
id user_name
1 user1
2 user2
3 user3

group_list
id group_name
1 gruppe1
2 gruppe2

event_list
id event_name
1 event1
2 event2

Wenn jetzt ein User Z.b. den Direkt link zum User2 in der shoutbox setzt

z.b. Hallo http://domain.tld/view_user.php?user=2 mach weiter so.

=

soll Hallo <a href="http://domain.tld/view_user.php?user=2">User2</a> mach weiter so kommen.

oder z.b.

Hey http://domain.tld/view_user.php?user=1 und http://domain.tld/view_user.php?user=3 ich bin auch auf das event http://domain.tld/view_event?event=2.

=

hey <a href="http://domain.tld/view_user.php?user=1">User1</a> und <a href="http://domain.tld/view_user.php?user=3">User3</a> ich bin auch auf das event <a href="http://domain.tld/view_event?event=2">event2</a>

mit gruppe genauso.

greets

ach ja, zum noch nicht gesehen, hier mal ein Beispiel dazu.

https://csdb.dk/group/?id=145 siehe Trivia.
bloodstix
bloodstix 16.03.2025 aktualisiert um 13:26:58 Uhr
Goto Top
Hallo,

sowas macht man aber nicht so. Dafür baut man sich templates und füllt die dann mit Daten. Schau dich mal bei anderen Plattformen um. Meist ist es z.B.
#Username
oder
@Username
was dann aus dem Beitrag gefiltert und zu deinem Ergebnis geparst wird. Du kannst ja nicht den Usern zumuten ihren "Text" mit deinen Links zu spicken!
Und deine "View_user" Links sind gefährlich. Da kann man nämlich einfach die ID's durchgehen und sich von allen Usern die öffentlichen Daten ziehen (was auch crawler und bots tun werden). Deshalb vielleicht lieber ne UUID als User-ID statt nem Integer. Das macht das abgrasen sehr viel schwerer.
genion18
genion18 16.03.2025 um 15:19:12 Uhr
Goto Top
Hallöchen,

templates wäre eine möglichkeit, oder ich fülle eine Tabelle mit allen Daten und gebe dann den Link über SQL aus.

Danke für den tip mit den öffentlichen Daten, da dort nix interesanntes drin steht ausser UserName, Groupzugehörigkeit oder events kann man nichts weiter finden zum crawlen.

greets
bloodstix
bloodstix 16.03.2025 aktualisiert um 15:51:47 Uhr
Goto Top
Red den Wert der Daten mal nicht klein. Du weisst was heutzutage mit Algorithmen möglich ist, wenn das dann mit anderen Daten verknüpft wird kann man da schon ggf. Rückschlüsse ziehen. Von daher solltest du das Aufrufen dieser view_user oder view_event links auch an einen eingeloggten User als Bedingung koppeln.

Ja klar kann man auch Lookup-Tabellen basteln aber eigentlich geht das effizienter sowas on the fly zu generieren.
Gibt auch die ein oder andere PHP-Lib die du einbinden könntest die so einen "BB-Code" bzw. "Forum-Code" parsen kann. Auch für Formatierungen, Fett, Kursiv usw. ...
sowas z.B. erster Google-treffer, sieht modern und clean aus: chriskonnertz/bbcode