problém s dvojitým explode a implode

dělám takovou srandu, že se všechno začínající http:// přemění na odkaz. nějak mi to ale nejde. když mám http://tarantino.wz.cz tak mi to místo <a href="http://tarantino.wz.cz" vypíše jen tarantino.wz.cz
....


$p1 = explode('http://', $vypis[text]);
for($i = 0; $i < count($p1); $i++) {
$p2 = explode(' ', $p1[$i]);
for ($ii = 0; $ii < count($p2); $ii++) {
if(substr($p2[$ii], 0, 7) == "http://") {
if (strlen($p2[$ii]) > 12){
$odkaz = substr($p2[$ii], 7);
$p2[$ii] = ("<a href=\"http://". $odkaz ."\">http://". $odkaz ."</a>");
}
}
}//konec vnitřní smyčky
$p1[$i] = implode(' ',$p2);
}//konec první smyčky
$text = implode('', $p1);
vim kde je chyba, ale nevim jak ji opravit, aby to bylo funkční
aha, ted mi to docvaklo.
není lepší udělat něco jako:
$text = preg_replace('/(http\:\/\/[^\s]*)/, "<a href=\"$i\">$1</a>", $vypis['text']);

co?
Souhlas, na tohle jsou lepší regexpy než explode a implode. Přidám svůj, můžeš si vybrat :)

$text = ereg_replace('([[:<:]]|[[:cntrl:]])((http://|ftp://)[[:graph:]]{1,})([[:>:]]|[[:cntrl:]])','<a href="\2">\2</a>',$text);
tak jsem použil to od MzM, pač je to kratší (jenom s drobnou úpravou - tvoje překlepy)... jenom sem vás chtěl poprosit o vysvětlení. manuál mi moc neřekl a moc dobře se to taky pochopit nedá.... tak dybyste byli tak hodní...

$text = preg_replace('/(http\:\/\/[^\s]*)/', "<a href=\"$1\">$1</a>", $vypis['text']);
OK, uvod:
najde kousek(ky) textu podle prvniho stringu a vymeni ho za druhy string vse ve tretim stringu.
prvni string je regularni vyraz:
/(http\:\/\/[^\s]*)/
reg vyraz zacina a konci znakem / mezi nimi je to, co se hleda.
hledat se muzou std znaky nebo spec, znaky.., tady se konkretne hleda:
http://<cosi> (/ - aby neukoncil tento znak reg vyraz, da se pred nej \ )
to <cosi> je [^\s]*, co z znamena libovolny nemezerovy znak 0 nebo Nx.
pak je to cele v zavorkach (), ktere to, co v nich je, priradi do promenne $1 (druhe zavorky do $2 atd)
to $1 je pak pouzite ve druhem stringu.
Dale doporucuji prostudovat libovolnou stranku o regularnich vyrazech.
vcelku jasný... pak ještě 2 otázky:

1) proč je před : to \ ...?k čemu tam je

2) nějaký příklad kdy by byly třeba 2 kousky by nebyl?
1. \ - tomu se rika escape character, ma specialni vyznam, vetsinou \x, kde x je libovolny znak, vypise prave tento znak, ktery by mel jinak specialni vyznam. Pak existuje \y, kde y je jedno z mala pismene, ktere maji specialni vyznam, treba: \n - novy radek (char(13)), \t - tabulator (char(9)), \r - LF \s bily znak (mezera, CR, LF, TAB), \S nemezerovy znak \d - cislice (tusim) atd

2. moc jsem to nepochopil, ale predpokladam:
$a = "Marek Prikryl";
$b = preg_replace('/(/S)* (/S)*/', "$2 $1, $a);
echo $b; # vypise Prikryl Marek

tohle?
ad 1) u tý dvojtečky chápu ale u těch písmen je to naopak, ne? /n má hodnotu nového řádku jen když je před tim zpětné lomítko.. ne? nebo to je u regulárních výrazů obráceně?

ad2) přesně tak jsem to myslel. btw kdybych měl

$a = "ahoj nazdar čus zdar";
$b = preg_replace('/(/S)* (/S)*/', "$2 $1, $a);
echo $b; # vypise mi to "nazdar ahoj zdar čus"?
ne. vypíše to buďto

"nazdar čus zdar ahoj"

nebo

"nazdar ahoj čus zdar"

jiné varianty si netroufám odhadovat, no nejlepší způsob, jak to zjistit, je to zkusit ;)
MF:
1. mam takovy pocit, ze zrovna u dvojtecky je tam to lomitko zbytecne. ostatni znaky viz treba http://www.regularnivyrazy.info/regularni-vyrazy-zaklady.html

2. tvuj vyraz vypise "nazdar ahoj" zbytek tam nebude.
jj, dix.
já ještě porádně pročtu regularnivyrazy.info
ještě poslední minidotaz:
je regulární výraz nějak spjat s funkcí? jestli by mohl např. být
$b = preg_replace('ahoj', "$1", $a);
?
a pak třeba napsat regulární výraz tam, kde se běžně používá string?
Moc nerozumím dotazu, ale předpokládám:
if ( preg_match($reg_v, $string) ) {
echo "ano sedi to na regv.";
} else {
echo "ne nesedi to na regv";
}

Jestli jsem to pochopil spatne, upresni dotaz...
nene, myslel jsem to tak jestli můžu regulární výraz používat kdekoli. dám příklad transformování v návštěvní knize:

$trans = array (
"<" => "<",
">" => ">"
);

můžu tam dát např.:

$trans = array (
"<" => "<",
">" => ">"
"/(www.[^\s]*)/" => "<a href=\"http://$1\" target=\"_Blank\">$1</a>"
);

?

tj. jestli se regulární výraz váže jenom na některé funkce...?
vyzkousej a uvidis ;)
<HTML>Popr. muzes zkusit muj... bere i IP adresy:
preg_match_all("/[\s|\.|:|,](.{3,4}:\/\/){0,1}([_|-|A-Za-z0-9|]+)[.]+([_|-|A-Za-z0-9|]+)[.]+([A-Za-z]{2,4})([-_~%#&=?.a-z0-9\/]*)/m", $_TEXT, $url_array);</HTML>
mám tu malý problém... -> potřeboval bych převádět adresy www. a http:// na odkazy. jenže tam je ten problém.
když udělám jeden preg_replace() pro http:// a www. tak nastane problém, když někdo napíše http://www. =/ napadlo mě udělat pomocí "nebo".
jako pokud začíná http:// nebo www. pak z toho udělej odkaz. ale tam je taky problém, protože to neví, kdy to má do <a href=" to http:// -> aby tam nebylo http://http:// pak mě napadlo udělat to podle http:// ale aby to bralo slovo vždy s mezerou (což nevím jestli bere). -> potom až www. (v případě http:// už to totiž nebude začínat mezerou). ale jak na to?


ještě jeden dotaz: může adresa obsahovat uvozovky? (kuli tomu aby mi tam někdo nedělal bordel.)