[php] Regexp + include's *

Pagina: 1
Acties:
  • 30 views sinds 30-01-2008

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 13:39
Zoals de meesten ben ik niet echt sterk in regular expressions. Dus, hier mijn vraag. Als je een bericht post met bijvoorbeeld deze tekst erin: [img align=center desc=1]images/bla/1.gif[/img] Dan moet er dus een plaatje worden weergegeven met als align = center en met als source images/bla/1.gif. Nou wilde ik dus ook als ALT tekst en als tekst eronder de tekst uit een text file halen.
Bij dit voorbeeld is dat images/bla/1.txt. In deze .txt staat de description van het plaatje.
Enfin, ik had dus deze code ervoor:
code:
1
2
$tekst = preg_replace("/\\[img align=([^\\[]*) desc=1\](.*?)\\[\/img\]/si", "<div align=\"\\1\"><img 
src=\"\\2\" border=\"1\" bordercolor=\"#FFFFFF\" alt=\"".include("\\1.txt")."\"></div>", $tekst);

Die include klopt niet, maar het gaat om het idee, werken doet het dus niet. Iemand een oplossing, of moet ik echt gaan explode'en?

zeroxcool.net - curity.eu


  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
Dat zal ook niet lukken op die manier. Je kan het proberen met de e modifieren. Daarmee zou je een functie kunnen oproepen die als parameter het getalletje neemt. Die zou dan de file in kunnen lezen en de goede regel terug geven.

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Gebruik 2 regexps:

1) Schrijf een regexp die alleen de bestandsnamen met de teksten eruit ript en mik die in een array.

2) Doorloop het array en mik alle data die uit de bestandjes komt ook in een array. Die komt er dan zo uit te zien:
code:
1
$AltTekstenArray = array("Alt tekst plaatje 1 yadi yadi", "En hier nog een alt tekst voor het 2e plaatje");

3) Maak een loopje dat 1 voor 1 alle [ img] tags afgaat, gebruik een modifier die steeds alleen de eerste gevonden [ img] tag vervangt. Gebruik daarbij de data uit $AltTekstenArray[$i]. Stop het loopje als er geen [ img] tags gevonden zijn.

Een extreem omslachtig systeem, ik snap ook niet waarom je zoiets als ALT tekst in losse bestandjes gaat stoppen :)

This can no longer be ignored.


  • tomato
  • Registratie: November 1999
  • Niet online
Dit werkt dan nog iets minder omslachtig:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
function getAlt($n) {
   lines = file($n.'.txt');
   return trim($lines[0]);
}

$p = '!\\[img(?:\s+border=([^\]\s]+))?\s*\]([^\\[])\\[/img\]!ie';
$r = '"[img]\"$2\"[/img]"';

$s = preg_replace($p, $r, $s);
?>

Niet getest, wat dingetjes vereenvodigd en ik heb de voorbeeld property 'border' optioneel gemaakt.

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 13:39
Thx guys =]. Maar nog een vraagje, hoe kan ik hier:
code:
1
$p = '!\\[img(?:\s+border=([^\]\s]+))?\s*\]([^\\[])\\[/img\]!ie';

Meer dingen inplanteren? (Ik snap de (?:\s+ niet...)

zeroxcool.net - curity.eu


  • tomato
  • Registratie: November 1999
  • Niet online
ZeRoXcOoL: (Ik snap de (?:\s+ niet...)
code:
1
(?:     )

Is in perl regexen niets anders dan gewone grouping (en evt alternation) parentheses, maar ze 'capturen' niet. Soms heb je grouping nodig, maar de tekst die er binnen valt is later helemaal niet meer nuttig in variabelen als $1 etc. Dan zijn noncapturing parentheses erg makkelijk, omdat je dan niet verder hoeft te tellen voor de grouping parentheses en ze brengen minder overhead mee (= snellere match).
code:
1
\s

Is een shorthand character class voor whitespace characters (meestal zoiets als spatie, form feed, newline, carriage return, tab, of vertical tab).

HTH :)

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 13:39
OK, heb dus nu zoiets:
code:
1
2
3
4
5
6
7
8
9
10
function alttext($n) {
    list($number,$ext) = explode(".",$n);
    $lines = file('i/p/'.$number.'.txt');
    echo trim($lines[0]);
}

    $p = '\\[img align=([^\\[]*) desc=1\]([^\\[]*)\\[\/img\]';
    $r = "<div align=\"\\1\"><img src=\"\\2\" 
border=\"1\" bordercolor=\"white\" alt=\"".alttext(\\2)."\"></div>";
    $tekst = eregi_replace($p, $r, $tekst);

Maar natuurlijk werkt die alt=\"".alttext(\\2)."\" niet. HELP :?

zeroxcool.net - curity.eu


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 13:39
^ KICK ^

zeroxcool.net - curity.eu


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 13:39
^ nog een keer SCHOPPEN ;) ^

zeroxcool.net - curity.eu


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 13:39
^ HELP ^

zeroxcool.net - curity.eu


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 13:39
^ Komop iemand weet dit toch wel ^

zeroxcool.net - curity.eu


  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Pfft wat een geschop.

Probeer 't met Perl regexps zoals in tomato z'n voorbeeld.

This can no longer be ignored.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

lekker geschop... btw tomato gebruikte preg_replace, jij ereg.. zou daar het verschil niet tussen kunnen zitten?
Pagina: 1

Dit topic is gesloten.