You are not logged in.

  • Login

1

Wednesday, April 11th 2007, 8:24am

Per $_GET Variable mit Url auslesen

Hallo Leute,

ich möchte eine übergebene Variable aus einer Url auslesen. Der Haken dabei: Bei der Variable handelt es sich um eine Url.
Z.B.: http://www.meinedomain.mein/view.php?url=http://www.anderedomain.mein/test.php?action=1&print=0

mit
$url = $_GET['url'];
lese ich die Variable aus, aber es geht nur bis action=1. Den Rest (&print=0) lässt er weg!

wie kann ich das problem beheben?
Gruß KMD

2

Wednesday, April 11th 2007, 8:35am

Re: Per $_GET Variable mit Url auslesen

Quoted from ""KMD""


ich möchte eine übergebene Variable aus einer Url auslesen. Der Haken dabei: Bei der Variable handelt es sich um eine Url.
Z.B.: http://www.meinedomain.mein/view.php?url=http://www.anderedomain.mein/test.php?action=1&print=0

mit
$url = $_GET['url'];
lese ich die Variable aus, aber es geht nur bis action=1. Den Rest (&print=0) lässt er weg!


Hallo,

das liegt daran, das die URL nicht richtig codiert ist. In PHP gibt es dafür die Befehle urlencode/urldecode:

HTML Code

1
http://www.meinedomain.mein/view.php?url=<?=urlencode('http://www.anderedomain.mein/test.php?action=1&print=0')?>

Mit

PHP Quellcode

1
$strUrl = urldecode($_GET['url']);

kannst Du die URL dann weiter verarbeiten.

melwood

3

Wednesday, April 11th 2007, 8:42am

Danke, ich werde es gleich mal ausprobieren!
Noch ne Frage: für was steht das = vor urlencode? Das ist mir bisher noch nie über den Weg gelaufen :)

4

Wednesday, April 11th 2007, 9:12am

Quoted from ""KMD""

Noch ne Frage: für was steht das = vor urlencode? Das ist mir bisher noch nie über den Weg gelaufen :)


afaik bedeudet das = zeichen das dass ergebis des befehls an der stelle benutzt wird. sonst müsstest du ja n echo oder print machen... aber da es nicht ausgegeben werden soll, sondern nur "benutzt" nimmt man das =

korrigiert mich falls ich da falsch liege ;)


mfg da BendIt

5

Wednesday, April 11th 2007, 9:13am

Quoted from ""KMD""

Danke, ich werde es gleich mal ausprobieren!
Noch ne Frage: für was steht das = vor urlencode? Das ist mir bisher noch nie über den Weg gelaufen :)


"<?='test'?>" ist das gleiche wie "<?php echo('Test')?>".

@BendIt: Das Ergbniss wird zwar "benutzt", aber zur Ausgabe! Wie gesagt, ist eigentlich nur eine Abkürzung...

melwood

6

Wednesday, April 11th 2007, 9:15am

naja war ich ja nahe dran -.-

7

Wednesday, April 11th 2007, 9:17am

Mh... irgendwie überschneiden wir uns mit unseren Posting ;-)

melwood

8

Wednesday, April 11th 2007, 9:18am

hehe, jo... irgendwie schon...

donut sollte mal n plugin hier einbauen, wo man sehen kann wer grade antwortet o,O

9

Wednesday, April 11th 2007, 9:25am

Hmm... ich dachte das kann nicht so ein Problem sein das einzubinden. Da habe ich mich allerding geirrt. Der Link wird per preg_replace erzeugt und ich bekomme es einfach nicht gebacken! :?

wenn ich es so mache

PHP Quellcode

1
$texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad.urlencode("http$3://$4$5")."\" target=\"_blank\">$2$4$5</a>", $texteinleitung);

werden $3,$4 und $5 nicht ausgegeben. Und wenn ich es so mache

PHP Quellcode

1
$texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad.urlencode("http".$3."://".$4.$5."")."\" target=\"_blank\">$2$4$5</a>", $texteinleitung);
bekomme ich eine PHP-Fehlermeldung.

Könnt Ihr mir bitte helfen? Ich bin noch nicht so fitt in php!

10

Wednesday, April 11th 2007, 9:46am

Quoted from ""KMD""

Hmm... ich dachte das kann nicht so ein Problem sein das einzubinden. Da habe ich mich allerding geirrt. Der Link wird per preg_replace erzeugt und ich bekomme es einfach nicht gebacken! :?

wenn ich es so mache

PHP Quellcode

1
$texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad.urlencode("http$3://$4$5")."\" target=\"_blank\">$2$4$5</a>", $texteinleitung);

werden $3,$4 und $5 nicht ausgegeben. Und wenn ich es so mache

PHP Quellcode

1
$texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad.urlencode("http".$3."://".$4.$5."")."\" target=\"_blank\">$2$4$5</a>", $texteinleitung);
bekomme ich eine PHP-Fehlermeldung.

Könnt Ihr mir bitte helfen? Ich bin noch nicht so fitt in php!


Ein Schuss ins Blaue, aber probiers mal so:

"<a href=\"".$viewpfad.urlencode("http{$3}://{$4}{$5}")."\" target=\"_blank\">{$2}{$4}{$5}</a>", $texteinleitung);

könnte evtl. funktionieren...

Oder mit preg_match den Link vorab zusammenbauen und dann ersetzten:

http://www.easy-coding.de/ermitteln-eine…feld-t3427.html

melwood

11

Wednesday, April 11th 2007, 11:28am

Ich verzweifle gleich :cry:

mit preg_match_all habe ich es immerhin hinbekommen das die Urls in eine TXT-Datenbank geschrieben werden (wie im anderen Beitrag schon besprochen). Aber wie ich replace dabei anwenden kann verstehe ich nicht. Des weiteren kommt dazu, dass in $texteinleitung mehrere Links vorkommen können, und das verwirrt mich noch mehr. Hier nochmal ein wenig mehr von meinem Code (Zusammengefasst).

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$messagehtml .= "";
 
// Links in die Statistik-TXT-Datenbank schreiben
preg_match_all("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatches, PREG_PATTERN_ORDER); 
if(is_array($arrMatches))
{
	foreach($arrMatches[0] as $url)
	{
		$datei = fopen($databases_dir."statistiken.txt", "a+");
		flock($datei,2);
		fputs($datei, "".$url.";;0;;\n");
		flock($datei,3);
		fclose($datei);
	} 
}
// Erzeugung eines Links mit <a href...>-Tag
$texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad."http$3://$4$5\" target=\"_blank\">$2$4$5</a>", $texteinleitung);
// Erzeugung eines E-Mail-Links mit <a href="mailto:...>-Tag
$texteinleitung = preg_replace("/([\w\_\-\.]+)(@)([\w\_\-\.]+)/i", "<a href=\"mailto:$0\">$0</a>", $texteinleitung);
 
$messagehtml .= $texteinleitung;
 
echo $messagehtml;


Ich stose mit der preg_match_all-Funktion leider an die Grenzen meines PHP-Lateins. Ich hoffe ihr könnt mir nochmal weiter helfen.

Gruß KMD

12

Wednesday, April 11th 2007, 11:38am

hi

mal ne frage: Wenn deine User die möglichkeit haben eine komplette URL in ein input feld zu schreiben und das dann mit dem formular abzuschicken, warum speicherst du den string dann nicht gleich in ner txt datei? also ohne irgendwelche preg/eregi funktionen? die regulären ausdrücke dienen bei dir doch eh nur der prüfung ob das eingegebene "Format" dem einer gültigen url entspricht? oder seh ich das falsch?

ich versteh das problem leider nicht ganz :-(

btw: was soll in $texteinleitungen drin stehen bzw was kann da alles drin stehen???

[edit]
schau dir mal folgenden link an http://selfphp.de/funktionsreferenz/url_funktionen/parse_url.php

evtl. hilft dir das weiter...

13

Wednesday, April 11th 2007, 12:24pm

Quoted from ""KMD""

Ich verzweifle gleich :cry:

mit preg_match_all habe ich es immerhin hinbekommen das die Urls in eine TXT-Datenbank geschrieben werden (wie im anderen Beitrag schon besprochen). Aber wie ich replace dabei anwenden kann verstehe ich nicht. Des weiteren kommt dazu, dass in $texteinleitung mehrere Links vorkommen können, und das verwirrt mich noch mehr.
Gruß KMD


Hallo,

in $arrMatches stehen alle URLs drin, wenn Du "PREG_SET_ORDER" verwendest und nicht "PREG_PATTERN_ORDER"!

Versuch's mal so in der Richtung:

PHP Quellcode

1
2
3
4
5
6
7
$texteinleitung ='https://www.ctserver.org, http://ctbot.de, www.jquery.de';
preg_match_all("/(((https?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatches, PREG_SET_ORDER);
foreach($arrMatches as $arrMatch) {
  	$strUrl = urlencode($arrMatch[0]);
  	$strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatch[0]);
  	$texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatch[0] . '</a>', $texteinleitung);
}


Jetzt kannst die die URL encode wie Du's brauchst.
Probleme machen allerdings jetzt noch Links ohne http(s), das müsste man noch abfangen...
Je nach dem, welche Teil-Matches Du wirklich benötigst könntest Du die Klammerung in Deiner RegEx noch wesentlich vereinfachen...

Wenn Du nicht klar kommst, dann füttere die Funktion einfach mit entsprechenden Strings und lass Dir $arrMatches ausgeben (echo('<pre>'); print_r($arrMatches); echo('</pre>'); )...

melwood

14

Wednesday, April 11th 2007, 12:42pm

@BendIt
Hier ein Link zu einer Abgespeckten Version der Funktion. Vieleicht erklährt es sich leichter wenn Du siehst was dabei rauskommen soll.
http://www.kmd-test.de/newsletter-datenbank-test/test/test2.php

15

Wednesday, April 11th 2007, 12:55pm

Quoted from ""KMD""

@BendIt
Hier ein Link zu einer Abgespeckten Version der Funktion. Vieleicht erklährt es sich leichter wenn Du siehst was dabei rauskommen soll.
http://www.kmd-test.de/newsletter-datenbank-test/test/test2.php


Sicherlich nicht die eleganteste Methode, und es fehlen auch noch ein paar "if"-Anweisungen, aber für mehr habe ich jetzt keine Zeit:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$viewpfad = 'http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=';
$texteinleitung ='Hier steht der vom User eingegeben Einleitungs-Text... In diesem Text können mehrere Links eingebunden werden. Z.B:
Link1: http://www.kmd-hosting.de/packages.php?pack=big&action=1
Link2: http://www.kmd-web.de
und Link 3: http://www.kmd-hosting.de/packages.php?pack=big&action=3 .
Es können aber auch Email-Adressen eingebunden werden. Z.B. info@meine-domain.mein .
Des Weiteren hat der User die Möglichkeit Mehrere Textblöcke, zB. für Produktbeschreibungen, zu erzeugen. Die Anzahl der Textblöcke ist nicht begrenzt und wird mit einem DOM-Konstrukt erzeugt. Anschliessend wird alles zusammen gefasst und in ein Newsletter-Template eingebunden. Beim Aufruf der Links soll zudem ein Counter die Klicks mit zählen.';
 
preg_match_all("/(((https?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatches, PREG_SET_ORDER);
 
foreach($arrMatches as $arrMatch) {
        $strUrl = urlencode($arrMatch[0]);
        $strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatch[0]);
        $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatch[0] . '</a>', $texteinleitung);
 
} 
 
 
 
preg_match_all("/([\w\_\-\.]+)(@)([\w\_\-\.]+)/i", $texteinleitung, $arrMatches, PREG_SET_ORDER);
 
foreach($arrMatches as $arrMatch) {
        $strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatch[0]);
        $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href=\"mailto:$0\">$0</a>' . $arrMatch[0] . '</a>', $texteinleitung);
}


melwood

16

Thursday, April 12th 2007, 2:00pm

OK. Danke! Funktioniert soweit bestens, bis auf ein kleines Problem.
Wenn im String $texteinleitung 2x die gleiche Emailadresse oder Links vorkommen, erzeugt er eine falsche Ausgabe. Sind alle Adressen oder Links unterschiedlich geht es ohne Probleme.

Hier nochmal mein geänderter Code

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Erzeugung von Links mit <a href...>-Tags
preg_match_all("/(((https?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatchesLinks, PREG_SET_ORDER);
if(is_array($arrMatchesLinks))
{
	foreach($arrMatchesLinks as $arrMatchLink)
	{
		$strEnd = substr($arrMatchesLinks[0], -1);
		if(!ereg("^[A-Za-z0-9]+$", $strEnd))
		{
			$arrMatchesLinks[0] = substr($arrMatchesLinks[0], 0, -1);
		}
		// URL Codieren (Wird in der view.php wieder Decodiert)
		$strUrl = urlencode($arrMatchLink[0]);
		$strSearch = str_replace(array('.', '/', '?'), array('\.', '\/', '\?'), $arrMatchLink[0]);
		// Erzeugung von Links mit <a href...>-Tags
		$texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatchLink[0] . '</a>', $texteinleitung);
 
	}
}
 
// Erzeugung von E-Mail-Links mit <a href="mailto:...>-Tags
preg_match_all("/([\w\_\-\.]+)(@)([\w\_\-\.]+)/i", $texteinleitung, $arrMatchesEmails, PREG_SET_ORDER);
if(is_array($arrMatchesEmails))
{
	foreach($arrMatchesEmails as $arrMatchEmail)
	{
		$strEnd = substr($arrMatchEmail[0], -1);
		if(!ereg("^[A-Za-z0-9]+$", $strEnd))
		{
			$arrMatchEmail[0] = substr($arrMatchEmail[0], 0, -1);
		}
		$strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatchEmail[0]);
		$texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="mailto:' . $arrMatchEmail[0] . '">' . $arrMatchEmail[0] . '</a>', $texteinleitung);
	}
}


Was läuft falsch? Bzw. wie kann ich das Problem abfangen?

Gruß KMD

17

Friday, April 13th 2007, 2:29pm

Häng mal an beide preg_replace als weiteren Parameter eine eins:


PHP Quellcode

1
$texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatchLink[0] . '</a>', $texteinleitung, 1);


Dadurch wird immer nur das erste Vorkommen ersetzt...

melwood

18

Sunday, April 15th 2007, 7:23pm

Hi melwood,

die "1" bringt leider nicht das gewünschte Ergebnis, denn bei mehrmaligem vorkommen eines Links wird nur der erste Link mit einem <A>-Tag maskiert.

Da es sich bei der Eingabe des Users um eine längere Produktbeschreibung handeln könnte, sollten durchaus die Eingabe mehrer gleiche Link erlaubt sein, welche dann auch mit dem <a>-Tag maskiert werden.

19

Sunday, April 15th 2007, 9:49pm

Hallo,

dann musst Du eben dafür sorgen, das jeder Link nur einmal bearbeitet wird:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
preg_match_all("/(((https?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatchesLinks, PREG_SET_ORDER);
if(is_array($arrMatchesLinks))
{
	foreach($arrMatchesLinks as $arrMatchLink)
	{
	    $arrSearched = array();
	    $strEnd = substr($arrMatchesLinks[0], -1);
	    if(!ereg("^[A-Za-z0-9]+$", $strEnd))
	    {
	            $arrMatchesLinks[0] = substr($arrMatchesLinks[0], 0, -1);
	    }
	    // URL Codieren (Wird in der view.php wieder Decodiert)
	    $strUrl = urlencode($arrMatchLink[0]);
	    $strSearch = str_replace(array('.', '/', '?'), array('\.', '\/', '\?'), $arrMatchLink[0]);
	    // Erzeugung von Links mit <a href...>-Tags
	    if(!in_array($strUrl, $arrSearched)) {
	        $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatchLink[0] . '</a>', $texteinleitung);
							$arrSearched[] = $strUrl;
	    }
	}
}
 
// Erzeugung von E-Mail-Links mit <a href="mailto:...>-Tags
preg_match_all("/([\w\_\-\.]+)(@)([\w\_\-\.]+)/i", $texteinleitung, $arrMatchesEmails, PREG_SET_ORDER);
if(is_array($arrMatchesEmails))
{
	foreach($arrMatchesEmails as $arrMatchEmail)
	{
	    $arrSearched = array();
	    $strEnd = substr($arrMatchEmail[0], -1);
	    if(!ereg("^[A-Za-z0-9]+$", $strEnd))
	    {
	            $arrMatchEmail[0] = substr($arrMatchEmail[0], 0, -1);
	    }
	    $strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatchEmail[0]);
	    if(!in_array($arrMatchEmail[0], $arrSearched)) {
	    	$texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="mailto:' . $arrMatchEmail[0] . '">' . $arrMatchEmail[0] . '</a>', $texteinleitung);
					$arrSearched[] = $arrMatchEmail[0];
	    }
	}
}


melwood

PS: Sorry für die komische Formatierung, liegt aber irgendwie an der Forensoftware...

20

Monday, April 16th 2007, 9:00am

Hi melwood,

Erstmal Danke für deine Mühe!
Ich traue es mich garnicht zu sagen aber es gibt da noch ein weiteres Problem.
Wenn der String folgendermasen aufgebaut ist:

PHP Quellcode

1
$texteinleitung="http://www.meinetestdomain.de , hier nochmal der Link mit html http://www.meinetestdomain.de/meinedatei.html

dann spuckt er folgendes aus:

HTML Code

1
2
3
<a href="http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=http%3A%2F%2Fwww.meinetestdomain.de" target="_blank">http://www.meinetestdomain.de</a>
, hier nochmal der Link mit html 
<a href="http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=http%3A%2F%2Fwww.meinetestdomain.de" target="_blank">http://www.meinetestdomain.de</a>/meinedatei.html

anstatt

HTML Code

1
2
3
<a href="http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=http%3A%2F%2Fwww.meinetestdomain.de" target="_blank">http://www.meinetestdomain.de</a>
, hier nochmal der Link mit html 
<a href="http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=http%3A%2F%2Fwww.meinetestdomain.de" target="_blank">http://www.meinetestdomain.de/meinedatei.html</a>

das heist, das er beim zweiten Link den Teil "/meinedatei.html" ignoriert.

Ich habe schon so einiges ausprobiert, aber leider ohne Erfolg.
Das komische ist auch, dass bei einer "echo" Ausgabe der Variablen $arrMatchLink[0] und $strSearch die URLs richtig ausgegeben werden sie werden aber anschließend nicht richtig ersetzt.

Kannst du mir nochmal helfen? Sorry für mein nervtötendes Problem :oops:

Gruß KMD

Similar threads

Social bookmarks