String formatieren

Sasser

Erfahrenes Mitglied
Guten Tag!

Ich habe einen String, welcher vom User übergeben wird. In diesem soll eine Domain folgendermaßen formatiert sein:

http://www.domain.de

Wie realisiert man das am besten, sodass am Ende dies herauskommt. Egal was der User noch davor oder danach geschrieben hat?

Achso meine Überlegung war so:

PHP:
$domain = strtolower ( str_replace ( "http://", "", $domain ) );
$domain = substr ( $domain, "0", strpos ( $domain, "/" ) );
if (substr ( $domain, "0", "4" ) != "www.") {
	$domain = "www." . $domain;
}
 
Zuletzt bearbeitet:
Also schreib mal im Klartext, was der User davor und danach schreiben kann.

Leut deiner Beschreibung sollte der User also sowas schreiben können:
"Ich bin ein Text und da steht domain drinne, welches dann umfarmatiert werden muss"
 
Ich vermute mal, dass du so einen Ausgangstext hast:
Ich bin ein lustiger Text in dem ein Link zu http://www.meinedomain.de/seite.php drin steht und dieser Link soll nun heraus gefiltert werden.
Und daraus willst du jetzt folgendes haben: www.meinedomain.de
Um dir einfach nur einen Hinweis zu geben: du musst auch bedenken, dass manche diese Seite nur so angeben: http://meinedomain.de oder meinedomain.de

EDIT: Meine Vermutung hat sich also bestätigt. Um es schon mal von Seiten der Auslastung des Servers zu betrachten, verwendest du meines Erachtens zu viele Funktionen für ein derart kleines Problem. Verwende dafür lieber RegEx.

EDIT 2: Ich habe mal ein kleines Beispiel für RegEx erstellt, was relativ gut Links aus einem Text filtert.
Code:
<?php
// Text bzw. String der durchsucht werden soll 
$string = <<<EOF
Ich bin ein lustiger Text in dem ein Link zu http://www.domain.de/seite.php steht und da ist noch ein Link und zwar blub.de
EOF;

// das Suchmuster mit Delimiter und Modifer (falls vorhanden) 
$pattern = '/((http:\/\/)?([][\.]*)(\.{2,4}))/u';

// RegEx mit preg_match_all() auswerten 
preg_match_all($pattern, $string, $array, PREG_SET_ORDER);

// formatierte Ausgabe 
echo '<pre>', print_r($array, true), '</pre>';
?>
Das erzeugt folgendes Array:
Code:
Array
(
     => Array
        (
             => http://www.domain.de
             => http://www.domain.de
             => http://
             => www.domain
             => .de
        )

     => Array
        (
             => seite.php
             => seite.php
             => 
             => seite
             => .php
        )

     => Array
        (
             => blub.de
             => blub.de
             => 
             => blub
             => .de
        )

)
 
Zuletzt bearbeitet:
Bei mir müsstest du eigentlich nur prüfen, ob die TLD gültig ist und nicht eine Dateiendung darstellt, ansonsten eben die Domain so zusammen setzen:
PHP:
$domain = $array[$i][3].$array[$i][4];
if($domain[0].$domain[1].$domain[2] !== 'www') $domain = 'www.'.$domain;
 
Ich danke! Werde dein beispiel mal ausprobieren! ;)

Ich bin bei meinen Nachforschungen auch auf die Funktion parse_url() gestoßen...

Gibts bei dieser irgendwelche Vor- oder Nachteile?
 
Der Begriff URL sagt aus, dass diese immer mit http:// anfängt. Falls du also auch andere Angaben beachten willst, dann solltest du darauf verzichten.
 
Hallo!

Irgendwie bekomme ich bei deinem Beispiel nur www. ausgegeben:

PHP:
$string = "http://www.abcdefghij.de/test/index.php";

preg_match_all ( "/((http:\/\/)?([[:alnum:]][[:alnum:]\.]*)(\.[a-z]{2,4}))/u", $string, $array, PREG_SET_ORDER );

$domain = $array[$i][3].$array[$i][4];
if($domain[0].$domain[1].$domain[2] !== 'www') $domain = 'www.'.$domain;  

echo $domain;

Oder habe ich etwas übersehen?
 
Das $i steht für den Wert in dem Array. Du musst jeden Eintrag einzeln abfragen.
PHP:
<?php
$string = 'http://www.abcdefghij.de/test/index.php';

preg_match_all('/((http:\/\/)?([[:alnum:]][[:alnum:]\.]*)(\.[a-z]{2,4}))/u',  $string, $array, PREG_SET_ORDER);


foreach($array as $value) {
  $domain = $value[3].$value[4];
  if($domain[0].$domain[1].$domain[2] !== 'www') $domain = 'www.'.$domain;
  
  $domains[] = $domain;
}

// Gibt dir ein Array mit allen verarbeiteten URIs aus
print_r($domains);
?>
 
Zuletzt bearbeitet:
Zurück