[php] preg_replace probleem (templates)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
hey y'all

ik zit met het volgende probleem. Ik wil dat als er in een stuk text
{text link text2:alt}

staat, hij dit vervangt door
text de-echte-link text2

ik heb dus een array, met keys & values en de keys staan in de text.
dus
foreach(list($k, $v) = each($templatevars)) {
// doe iets waar ik niet uitkom
}
dan, moet hij alle {} tags aflopen waar dus geen $key voor was en vervangen door de alt-waarde. Daarna moet-ie alle {} vervangen door nix

En het lukt me dus zowel niet om een preg_replace te maken die "tot" de : zoekt (en als-ie er niet is toch werkt), en vv. 1 die "vanaf" de : zoekt en die vervangt.

wie helpt?!?!?!?!?

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • p0m
  • Registratie: September 2000
  • Laatst online: 29-08 16:03

p0m

Wat een vaag en onduidelijk voorbeeld :?(voor mij tenminste ;))

Kan je niet een concreet voorbeeldje geven van je templates en hoe ze moeten werken?
Dan kan ik je beter helpen met je regextjes. :)

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
een template:
message posted by {nickname}
{<a href='replylink'>reply</a> : reply}

waarbij replylink dus de $k waarde is. in dit geval, moet er dus een link gemaakt worden als de replylink bestaat, en anders komt er enkel reply te staan...

een preg die ik zelf had verzonnen (werkt wel maar niet zoals ik wil) (ff uit 't hoofd)

$template = preg_replace('\{(.*)' . $k . '(.*)\}','\\1' . $v . '\\2',$template);

maar hier wordt dus nog geen gebruik gemaakt van de : etc.

any help is welcome...

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
anyone?

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

chem: anyone?

Je uitleg is niet erg helder (of ik word seniel, een van die twee denk ik;)) maar ik zal een poging doen:

Is
code:
1
{text link text2:alt}

het vaste formaat waar je op zoekt?

Dus tussen accolades: 3 woorden eventueel gevolgd door : en nog een woord?

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
ja, maar dan: 1 stuk text, 1 woord (dat is $k), een stuk text en vv. evt. : stuk text.

dan moet $k vervangen worden, met texten ervoor & achter, en wat er (evt.) achter : staat moet niet worden geprint.

Daarna moet-ie alle {:alt} texten zoeken en alt printen.

Of is het slimmer door de text heen te gaan, en voor elke {} te zoeken of-ie bestaat en etc.?

jajaja wazige uitleg :?

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien helpt het als je uitlegt wat je wilt bereiken?

Ik kan je wel een regex geven om dit soort dingen te matchen maar ik weet niet of je daar wat mee opschiet.

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
okay...

misschien ken je fast templates wel...

die kent zgn. dynamic blocks, maar dat werkt met <! begin --> en <!-- end-->

ik vind dat nogal suckie want je hebt dan ekel een IF situatie. Ik wil een IF/ELSE maken. Dus ik heb een array met keys & values. Ik zoek in de templates naar {key} en vervang die door value. Maar, ik wil dus iets meer doen: ik wil nadat alles keys zijn vervangen de overgebleven {}'s vervangen door hun alt-tag.

Bijvoorbeeld: een topic is gesloten -> er is geen link naar een nieuw bericht, maar ik wil wel dat er iets anders getoond word...

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

chem: Misschien ken je fast templates wel...

Niet mee gewerkt, maar ken het idee en heb de source gezien en besloot er toen niet te gaan werken. :)

Die kent zgn. dynamic blocks, maar dat werkt met <! begin --> en <!-- end-->. Ik vind dat nogal suckie want je hebt dan enkel een IF situatie. Ik wil een IF/ELSE maken.

Dat dacht ik al te begrijpen. Blij dat ik dat goed begreep.

Dus ik heb een array met keys & values. Ik zoek in de templates naar {key} en vervang die door value.

En die value is een van de mogelijk twee waarden die er kunnen zijn (en die in dat blok staan)?

Waarom dan niet zoiets? {NAAM [tekst]:[alt-tekst]} Dan bereik je hetzelfde als ik het goed begrijp.

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
nou, een voorbeeld van een paar array entries:"

$a["linktonewmessage"] = $forumfilename . "?action=newmessage&TopicID=" . $row"TopicID"];

of

$a["linktoroot"] = $rootfile;

en in de template zet je bv:
en als je dit topic leuk vindt:
{<a href='linktonewmessage'>new reply</a>:new reply - not possible}, of ga terug naar de {<a href='linktoroot'>root</a>}

snap je? er kan dus ook geen :alt text staan... als daar geen waarde voor bestaat wordt-ie gewoon gestript.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 17-09 15:28

Tuinhark

Retro

Een echte oplossing voor je probleem heb ik niet chem.. het is me nog ietwat wazig. :?

Maar ik heb nog wel een alternatieve sucky template engine. :) Eentje die ik ook in YapBB gebruik. Die kent niet zozeer <if> <else> <endif> blokken, maar wel een alternatief. Hááást net zo goed. ;)

Email staat in da profile.

:Y)

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
okay, dan stel ik de vraag op NOG een andere manier :)

ik zoek een preg_replace die
{(.*?)woord(.*?)} matcht
maar ook
{(.*?)woord(.*?) : (.*?)}

en ik zoek een die
{(.*?) : (.*?)} matcht

oh, en : mag ook || of iets anders zijn...

en dan ben ik blij... vooral als de bovenste 2 in 1 kunnen... dat zou flink wat cputijd schelen!!!

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 17-09 15:28

Tuinhark

Retro

1e 2 ineen:
code:
1
$text = preg_replace("(\{(.*?))(" . quotemeta($k) . ")((((.*?)(:|(\|\|)))?(.*?)\})", "\\1$v\\2", $text);
en ik zoek een die
{(.*?) : (.*?)} matcht
Wat wil je met die 3e doen? :?

edit:

ff een <space> gekilled *D


:Y)

Acties:
  • 0 Henk 'm!

Verwijderd

chem: Ik zoek een preg_replace die
[code]{(.*?)woord(.*?)}[/code]
matcht, maar ook
[code]{(.*?)woord(.*?) : (.*?)}[/code]


Je kunt achter dat optionele " : (.*?)" een ? zetten om het optioneel te maken. Dan krijg je zoiets:
code:
1
!\{(.*?)woord(.*?)(\s+:\s+(.*?))?\}!

En ik zoek een die
[code]{(.*?) : (.*?)}[/code]
matcht.


Zoiets?
code:
1
!\{(.*?)\s+:\s+(.*?)\}!

HTH

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
met die 3e wil ik dus de alt-textjes vinden & plaatsen...

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 17-09 15:28

Tuinhark

Retro

Valt me weer op dat Arien gewoon een beter antwoord geeft. Wellicht niet de oplossing, dat mag chem testen ;), als wel de toelichting... Ik zet het in het PPV-plan. :P

:Y)

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
okay, die van TH werkt niet (parse errors) en die van arien preobeer ik nu...

misschien nog vergeten te zeggen: er kan ook geen text voor/achter staan en die (.*?) is maar 'ter illustratie' dus ...

ik ga ff arien's ding testen

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 17-09 15:28

Tuinhark

Retro

Als je het zo eens doet:
code:
1
2
3
4
5
6
7
$part1 = "(\{(.*?))";
$part2 = "(" . quotemeta($k) . ")";
$part3 = "(((.*?)(:|(\|\|)))?(.*?)\})";
$expression = $part1 . $part2 . $part3;


$text = preg_replace($expression, $v, $text);

Niet dat je het probleem hier mee oplost, maar zo kun je het probleem lokaliseren.

(Er zat trouwens zowiezo nog een bugje in mbt \\3 --> \\2 ;))

edit:

Damn typos.. Volgens mij wordt ik scheel. :(


[edit2]
Ik heb denk ik iets verkeerd begrepen.. Ik heb het nog weer een beetje aangepast. :)
[/edit2]

:Y)

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
okay, hij doet 't wel/niet
zie http://forum.glitter-it.nl/forum.php?action=list_messages&TopicID=102

zoals je ziet pakt 'ie nog niet diegene met de : erin...

tip?

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
oh, ik heb de template class ff neergepleurd:
http://forum.glitter-it.nl/template.txt

maar 't wil dus nog niet helemaal maar ik vind het al heel wat :)

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

chem: Zoals je ziet pakt 'ie nog niet diegene met de : erin... Tip?

Als je
code:
1
!\{(.*?)woord(.*?)(\s+:\s+(.*?))?\}!

gebruikt moet je \4 gebruiken ipv \3. Helpt dat? :)

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
hmz, damn, ik zit dus nu precies vast op hetzelfde punt als waar ik gestrand was...

ik kan de pregjes amper lezen, wat het allemaal lastiger maakt :)

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

chem: Ik kan de pregjes amper lezen, wat het allemaal lastiger maakt :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
/
\{        # match een accolade
(.*?)     # gevolg door zo min mogelijk "iets"
woord     # gevolgd door het woord
(.*?)     # gevolgd door zo min mogelijk "iets"
(         # gevolgd door mogelijk ...
   \s+    # ... whitspace,
   :      # een dubbele punt,
   \s+    # whitespace
   (.*?)  # gevolgd door zo min mogelijk iets
)?
\}     # gevolgd door een sluit accolade
/x

En in Perl (ja, ja, ja... PHP rules enzo)is dit nog een geldige regex ook. Misschien dat PHP dat ook nagemaakt heeft? :P

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
shit he

DA'S PAS DUIDELIJK

ik ga ff spelen dan :)

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

PHP schijnt dit trouwens ook te kunnen met de preg-* functies:
/x (PCRE_EXTENDED)

If this modifier is set, whitespace data characters in the pattern are totally ignored except when escaped or inside a character class, and characters between an unescaped # outside a character class and the next newline character, inclusive, are also ignored. This is equivalent to Perl's /x modifier, and makes it possible to include comments inside complicated patterns. Note, however, that this applies only to data characters. Whitespace characters may never appear within special character sequences in a pattern, for example within the sequence (?( which introduces a conditional subpattern.

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
nou, doet 't..beh. dat met

$template = preg_replace("!\{(.*?)" . quotemeta($k) . "(.*?)(\s+:\s+(.*?))?\}!", "\\1" . $v . "\\2", $template);

er soms een \ voor de $v staat?

en met

$template = preg_replace("!\{(.*?)(\s+:\s+(.*?))?\}!", "\\2", $template);

neemt hij de ": " mee in de \\2

daarbij lukt bv {forum_name} enzo niet altijd... er blijft { staan en verder doet-ie een beetj wazig

idee?

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

chem: Met
[php]
<?
$template = preg_replace(
"!\{(.*?)(\s+:\s+(.*?))?\}!",
"\\2",
$template
);
?>

[/php]
neemt hij de ": " mee in de \\2.


\1 vangt het eerste iets,
\2 het mogelijk tweede gedeelte (incusief \s+:\s+),
\3 bevat wat je wilt hebben waarschijnlijk.

Voor \x tel je openingshaken van links naar rechts.

HTH

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Topicstarter
hmz nee, dat helpt niet echt...

ik blijf met rare dingetjs zitten, zie m'n forum maar...

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer eens een zo simpel mogelijke test-case te maken (en te posten als je er niet uit komt natuurlijk ;)), zodat je het probleem kunt isoleren. Ik geloof niet dat de regexen verkeerd zijn.
Pagina: 1