es funktioniert nur eins!!!

Operator_Jon

Erfahrenes Mitglied
HI!
Folgender code:
PHP:
//Allgemeiner BBCode
  $postpic_maxx = 640; 
  $postpic_maxy = 480;
  //In form von http://
  $value = preg_replace("=(^|\ |\\n)(http:\/\/|http:\/\/www\.)([a-zA-Z0-9\.\/-\_]{1,})=i", 
  "\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a> ",$value);
  //in form von www.
  $value = preg_replace("=(^|\ |\\n)(www\.)([a-zA-Z0-9\.\/-\_]{1,})=i", 
  "\\1<a href=\"http://\\2\\3\" target=\"_blank\">\\2\\3</a> ",$value);
  //in form von 
  $value = preg_replace("=(^|\       
  |\\n)\[url\](http:\/\/|http:\/\/www\.)([a-zA-Z0-9\.\/-\_]{1,})\[/url\]=i", 
  "\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a> ",$value);
  //in form von url=lll|linkbeschreibung|/url
  $value = preg_replace("=(^|\ |\\n)\[url\=(http:\/\/|http:\/\/www\.)([a-zA-Z0-9\.\/-\_]{1,})\]([a-zA-Z0-9\:\.\/-\_]{1,})\[/url\]=i", 
  "\\1<a href=\"\\2\\3\" target=\"_blank\">\\4</a> ",$value);
  $value = preg_replace("=(^|\ |\\n)\[url\](www\.)([a-zA-Z0-9\.\/-\_]{1,})\[/url\]=i", 
  "\\1<a href=\"http://\\2\\3\" target=\"_blank\">\\2\\3</a> ",$value); 
  $value = preg_replace("=(^|\     |\\n)\[url\=(|www\.)([a-zA-Z0-9\.\/-\_]{1,})\]([a-zA-Z0-9\:\.\/-\_]{1,})\[/url\]=i", 
  "\\1<a href=\"http://\\2\\3\" target=\"_blank\">\\4</a> ",$value);
  $value = preg_replace("=(^|\ |\\n)([a-zA-Z0-9\.\/-\_]{1,})@([a-zA-Z0-9\.\/-\_]{1,})=i", 
  "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a> ",$value);
  $value = preg_replace("=(^|\     |\\n)\[email\]([a-zA-Z0-9\.\/-\_]{1,})@([a-zA-Z0-9\.\/-\_]{1,})\[\/email\]=i", 
  "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a> ",$value);
  if(preg_match("=(^|\ |\\n)(\[img\])([a-zA-Z0-9\.\/-\_\:]{1,})(\[/img\])=i",$value,$url)) 
  { 
    $info = getimagesize($url[3]); 
    if(($info[2]>3)||($info[2]<1)) 
    { 
      $replace = "<a href=\"".$url[3]."\" target=\"_blank\">** Eingefügtes Bild **</a>"; 
    }
    else 
    { 
      if($info[0] <= $postpic_maxx) 
        $replace = "<center><img src=\"".$url[3]."\" width=\"".$info[0]."\"     height=\"".$info[1]."\"></center>"; 
      else 
      { 
        $faktor = $postpic_maxx/$info[0]; 
        $info[0] = $info[0]*$faktor; 
        $info[1] = $info[1]*$faktor; 
        $replace = "<center><img src=\"".$url[3]."\" width=\"".$info[0]."\" height=\"".$info[1]."\"></center>"; 
      } 
    } 
    $value = preg_replace("=(^|\ |\\n)\[img\]([a-zA-Z0-9\.\/-\_\:]{1,})\[/img\]=i",$replace,$value); 
  }
Klappt auch alles wunderbar, nur funktioniert immer nur eins von diesen sachen!
sagen wir ich nehme ein (wegen dem forum anders geschrieben) |url=http://irgendwas.de|irgendwas|/url|
und danach nochmal das selbe, oder irgendeinanderes preg_replace!
Nur das erste funktioniert, einer ne ahnung wieso???
THX
cu
OP_Jon
 
du solltest auch noch definieren wioft das script durchsucht werden soll!

also sowas in der Art:

PHP:
for ($i = -1; $i <= substr_count($text,"[ url ]"); $i++)

substr_count zählt wie oft die Zeichenkete [ url ] in $text vorkommt.
also schreibst du es dann ungefähr so:

PHP:
for ($i = -1; $i <= substr_count($value,"[ url ]"); $i++)
{
   $value = preg_replace("=(^|     |\n)[ url=(|www.)([a-zA-Z0-9./-_]
   {1,})]([a-zA-Z0-9:./-_]{1,})[ /url]=i",
   "\1<a href=\"http://\2\3\" target=\"_blank\">\4</a> ",$value);
}

mfg

Spea
 
Naja, ich habe es nun so gemacht:
PHP:
function bbcode($s) {
$postpic_maxx=300; 
$postpic_maxy=300;
for ($i = -1; $i <= substr_count($s,"http://"); $i++) {
  $s=preg_replace("=(^|\ |\\n)(http:\/\/|http:\/\/www\.)([a-zA-Z0-9\.\/-\_]{1,})=i", 
  "\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a> ",$s);
}
for ($i = -1; $i <= substr_count($s,"www."); $i++) {
  $s=preg_replace("=(^|\ |\\n)(www\.)([a-zA-Z0-9\.\/-\_]{1,})=i", 
  "\\1<a href=\"http://\\2\\3\" target=\"_blank\">\\2\\3</a> ",$s);
}
for ($i = -1; $i <= substr_count($s,"[url]"); $i++) {
  $s=preg_replace("=(^|\       
  |\\n)\[url\](http:\/\/|http:\/\/www\.)([a-zA-Z0-9\.\/-\_]{1,})\[/url\]=i", 
  "\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a> ",$s);
  $s=preg_replace("=(^|\ |\\n)\[url\](www\.)([a-zA-Z0-9\.\/-\_]{1,})\[/url\]=i", 
  "\\1<a href=\"http://\\2\\3\" target=\"_blank\">\\2\\3</a> ",$s);
}
for ($i = -1; $i <= substr_count($s,"[url="); $i++) {
  $s=preg_replace("=(^|\ 
|\\n)\[url\=(http:\/\/|http:\/\/www\.)([a-zA-Z0-9\.\/-\_]{1,})\]([a-zA-Z0-9\:\.\/-\_]{1,})\[/ur
  l\]=i", 
  "\\1<a href=\"\\2\\3\" target=\"_blank\">\\4</a> ",$s);
  $s=preg_replace("=(^|\ 
  |\\n)\[url\=(|www\.)([a-zA-Z0-9\.\/-\_]{1,})\]([a-zA-Z0-9\:\.\/-\_]{1,})\[/url\]=i", 
  "\\1<a href=\"http://\\2\\3\" target=\"_blank\">\\4</a> ",$s);
}
for ($i = -1; $i <= substr_count($s,"[email]"); $i++) {
  $s=preg_replace("=(^|\ 
  |\\n)\[email\]([a-zA-Z0-9\.\/-\_]{1,})@([a-zA-Z0-9\.\/-\_]{1,})\[\/email\]=i", 
  "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a> ",$s);
}
$s=preg_replace("=(^|\ |\\n)([a-zA-Z0-9\.\/-\_]{1,})@([a-zA-Z0-9\.\/-\_]{1,})=i", 
  "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a> ",$s);
for ($i = -1; $i <= substr_count($s,"[img]"); $i++) {
  if(preg_match("=(^|\ |\\n)(\[img\])([a-zA-Z0-9\.\/-\_\:]{1,})(\[/img\])=i",$s,$url)) 
  { 
    $info=getimagesize($url[3]); 
    if(($info[2]>3)||($info[2]<1)) 
  { 
    $replace="<a href=\"".$url[3]."\" target=\"_blank\">** Eingefügtes Bild **</a>"; 
  }
  else 
  { 
    if($info[0]<=$postpic_maxx) 
      $replace="<center><img src=\"".$url[3]."\" width=\"".$info[0]."\" 
      height=\"".$info[1]."\"></center>"; 
  else 
  { 
    $faktor=$postpic_maxx/$info[0]; 
    $info[0]=$info[0]*$faktor; 
    $info[1]=$info[1]*$faktor; 
    $replace="<center><img src=\"".$url[3]."\" width=\"".$info[0]."\" 
    height=\"".$info[1]."\"></center>"; 
  } 
  } 
    $s=preg_replace("=(^|\ |\\n)\[img\]([a-zA-Z0-9\.\/-\_\:]{1,})\[/img\]=i",$replace,$s); 
  }
}
$s = eregi_replace("\[p\]", "<p>", $s); 
$s = eregi_replace("\[\/p\]", "</p>", $s); 

$s = eregi_replace("\[center\]", "<center>", $s); 
$s = eregi_replace("\[\/center\]", "</center>", $s); 

$s = eregi_replace("\[verdana\]", "<span style=\"font-family:verdana;\">", $s); 
$s = eregi_replace("\[\/verdana\]", "</span>", $s); 

$s = eregi_replace("\[times\]", "<span style=\"font-family:times;\">", $s); 
$s = eregi_replace("\[\/times\]", "</span>", $s); 

$s = eregi_replace("\[arial\]", "<span style=\"font-family:verdana;\">", $s); 
$s = eregi_replace("\[\/arial\]", "</span>", $s); 

$s = eregi_replace("\[q\]", "<blockquote>", $s); 
$s = eregi_replace("\[\/q\]", "</blockquote>", $s); 

$s = eregi_replace("\[list\]", "<ul>", $s); 
$s = eregi_replace("\[\/list\]", "</ul>", $s); 
$s = eregi_replace("\[numlist\]", "<ol>", $s); 
$s = eregi_replace("\[\/numlist\]", "</ol>", $s); 
$s = eregi_replace("\[-\]", "<li>", $s);
return($s);
}
das funktioniert immer noch nicht!!!
nach einem preg_replace ist schluss!!!
der rest funzt wunderbar, nur die pregs...
 
Zuletzt bearbeitet:
preg_replace ersetzt auch immer nur eins, wenn du alle erwischen willst musst du die matchings in einem array an preg_replace übergeben

ich finds auch blöd, nur kenn ich keine bessere variante:

preg_match_all($pattern,$subject,$matchings);
foreach($matchings[2] as $value){
$replaces[] = "blablabla".$value."blablabla";
}
preg_replace($pattern,$replaces,$subject);
 
ähhmmmm...
*nixversteh*^^
waär es zu viel, wenn ich mal frage ob du diesen code ein wenig erklärst *schwitz*
das mit dem pattern, subject und matchings versteh ich net!
also ich versteh das nun so:
preg_match_all("<<ka>>",<<ka>>,<<ka>>);
schleife(<<ka>>[2] as variable) {
replaces[] = "";
}
preg_replace(<<ka>>,$replaces,<<ka>>);
also, preg_match_all speichert alles was er zu <<ka>> gefunden hat in ein array(das macht die schleife,glaub ich...) und preg_replace ersetzt das dann alles...
hmmmm... versteh ich net;)
thx
cu
OP_Jon

PS: <<ka>> heisst <<keine ahnung>>!
 
du hast es doch schon erfasst! genau das macht es!

preg_match_all sucht mit dem suchausdruck (pattern) nach allen vorkommnissen (deswegn match_all) und speichert diese im array $matchings (treffer)

dann hab ich ne schleife gemacht

foreach($matchings[2] as $wert){

die 2 steht für das 2. subpattern (die abschnitte in deinem ausdruck die in runden klammern stehen) also den teil mit [A-Zusw.], du kannst dir auch mal mit print_r($matchings) das array im browser ausgeben lassen, dann siehst du wie es aufgebaut ist.

weiter im text:
in der schleife baust du dir dein ersetzen-string zusammen, also das was anstelle des codes hin soll

also quasi:

$replaces[] = "<a href=\"".$wert."\" target=\"_blank\">".$wert."</a>";
}

und dann ersetzt du das mit preg_replace, für pattern nimmst du den selben suchausdruck wie oben bei match_all. $replaces ist das array mit den ganzen werten die ersetzt werden sollen.

$ergebnis = preg_replace($pattern,$replaces,$subject);

so, jetzt müsste es verständlich sein. wenn nicht, sags ;-)
 
is super verständlich, THX
nur...
in preg_match_all, wofür ist dort das subject???
und bei $ergebnis = preg_replace($pattern,$replaces,$subject);
durch was werden dotr die variablen ersetzt?

//EDIT:
also...
PHP:
preg_match_all("[url]",???,$matchings);
foreach ($matchings[2] as $wert) {
  $replaces[] = "<a href=\".$wert.\" target=\"_blank\">".$wert."</a>";
}
$value = preg_replace("[url]",$replaces,???);
und... wie geht das dann auch gleich für "[url=..[/url"?
THX
cu
OP_Jon
 
Zuletzt bearbeitet:
is nen bischen komplimizierter, aber eigentlich genauso einfach:

die struktur des ergebnisses von preg_match_all sieht so aus:

array(
[0] => array( alle kompletten Treffer mit allem drum und dran... )
[1] => array( 1. subpattern (suchstring) )
[2] => array( 2. subpattern (suchstring) )
[n] => array( n. subpattern )
)

also nehmen wir mal an deine URL ist im 2. subpaatern gespeichert und die url-bezeichnung im 4. subpattern, dann schreibst du das so:

foreach($matchings[4] as $i=>$wert){
$replaces[] = "<a href=\"".$matchings[2][$i]."\">".$wert."</a";
}

$subject ist nichts anderes als der string (die seite) die du verändern willst
 
und woher soll ich wissen was was ist?
naja...
könntest du villeicht das script mit
und
als *.txt anhängen?
ich versteh das einfach nicht:-(
 
du weist was was ist indem du mit nem einfachen print_r($matchings); dir die struktur des arrays anguckst, dann wirst du schnell in erfahrung bringen wie das funktioniert.

guck dir zur not nochmal im manual die seite zu http://www.php.net/search.php?show=quickref&pattern=preg_match_all an

vllt. mal ein beispiel:

Code:
blabla bla blablabla [ url=http://www.vielbla.de]blabla[ /url]

dein pattern sieht dann so aus:

Code:
$pattern = "/[ url=(.*)](.*)[ /url]/";

wie du erkennst, habe ich nur 2 subpattern, die jeweils in klammern eingeschlossen sind. dementsprechend besteht dann mein matchings-array aus 3 teilarrays

das erste ist der gesamte string, also
[ url=http:/ /www.vielbla.de ]blabla[ /url ]
das zweite ist die url
[ url ]http:/ /www.vielbla.de[ /url ]
das dritte die bezeichnung
blabla

das array sieht dann so aus:

Code:
array(
  [0] => array ( 
     [0] => "[ url=http:/ /www.vielbla.de]blabla[ /url]"
         )
  [1] => array (
     [0] => "http:/ /www.vielbla.de"
         )
  [2] => array (
     [0] => "blabla"
         )
)

deine schleife sähe dann so aus:
Code:
foreach($matchings[2] as $i=>$wert){
$replaces[] = "<a href=\"".$matchings[1][$i]."\">".$wert."</a";
}

er liest alle einträge mit einer bezeichnung aus wobei der schlüßel der index ist (den wir gleich noch brauchen) und $wert die bezeichnung

beim zusammenbauen brauchen wir aber die url, die noch im alten array matchings drin ist, daher greifen wir in das teilarray mit den url's (bei mir die 1) und dort holen wir uns mithilfe des indexes $i die passende url. kling komisch, is aber so ;)

/edit: manchmal kann einen der vB-Code tierisch auf den sack gehen :rolleyes:
 
Zuletzt bearbeitet:
Zurück