Toon posts:

[php] regex in for-loop

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb wederom een interessant (vinnik :)) probleem:

Ik zoek een algoritme, dat wanneer je een soort template van een functie invoert en een een array, met de waardes die die functie mee moet krijgen, hij die functie invult.

Voorbeeld:
de functie is
$template = "beginform(\$phpscript,\$action,\$title,\$colspan=2,\$name="form",\$addtable=1)";
en de array is
$arg[] = "test 1";
$arg[] = "test 2";
$arg[] = "test 3";
$arg[] = "test 4";
$arg[] = "test 5";
$arg[] = "test 6";

moet dat veranderen in
beginform("test 1", "test 2", "test 3", "test 4", "test 5", "test 6");

Nu ben ik hier al een uur mee bezig ofzo, maar het is met tot dusver niet gelukt er een geschikt algoritme voor te vinden. Ik heb op dit moment dit gevonden, iets wat absoluut niet werkt ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        $replace = "!";

        $instance = $template;

        for ($i=1; $i <=  $aantal_vars; $i++) 
        {
            $replace .= "(\$(.*))";

            $calc = 1+(($i-1)*2);

            $replacement .= "\\".$calc;

            $instance = preg_replace("$replace!", "".preg_replace("!\\$calc!", $arg[$i], $replacement)."", $instance);
        
            echo $replace."<br>";
            echo addslashes($replacement)."<br><hr><br>";
        }


Wie kan mij op het goede spoor zetten? Alvast bedankt!

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 04-08 13:06

GraasGast

Analogue Heaven

preg_replace() is een hele mooie functie. De argumenten die je meegeeft kunnen ook arrays zijn. je maakt dus een array met patterns aan, en een array met de bijbehorende replacements. op die manier hoef je preg_replace maar 1 keer aan te roepen, en heb je ook geen loop meer nodig.

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Wat ook altijd aardig is als je geen oplossing kunt vinden: Je probleem aanpassen :)

Je template zit in een aardig bedenkelijke vorm, waarom zitten er in die template argument-namen terwijl je $arg array daar niet over rept?

De vraag is dus eigenlijk: Wat is het doel van je script en zit je daarom vast aan de php-syntax van je template?
Zoja, dan betekend dat dus dat je eigenlijk een stukje php-parser moet gaan nabouwen, wat natuurlijk aardig irritant werk is.
Zonee, waarom geef je de template niet in een makkelijkere vorm, zoals een array?

|_____vakje______|


Verwijderd

Topicstarter
Ok, ik heb hem net in een andere vorm gegoten, namelijk één grote string waarin de bezoekers zelf alles invult (het is voor een technisch hulpmiddel dat alleen ik zal gebruiken dus het mag best aan de ingewekkelde kant zijn).

Maar goed, eer je het ene probleem hebt opgelost doemt het volgende wel weer op aan de horizion :(

Ik moet als laatste stapje voor dat geval nog een preg_replace maken, die in een bepaalde text het volgende er uit haalt, iets wat meerdere keren voorkomt:

BLABLA
if ($action==\"waarde\")
BLABLA

dus met de backslashes quotes.

Nu moet ie alleen waarde overhouden en de rest eruit filteren.

Ik kreeg het niet voor mekaar met enkel een preg_replace, dus heb ik er een tweede omslachtige functie voor gebruikt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function cleanTheMess($str) 
{

    $str = str_replace("(", "DITISEENHAAKJEOPENEN", $str);
    $str = str_replace(")", "DITISEENHAAKJESLUITEN", $str);
    $str = str_replace("\$", "DITISEENDOLLARTEKEN", $str);
    $str = str_replace("\\\"", "DITISEENQUOT", $str);
    $str = str_replace("==", "DITISEENISIS", $str);
    $str = str_replace("<BR>{ <BR>} <br /> ?>", "", $str);
    $str = trim($str);

    return $str;
}

    $fields = cleanTheMess($php);
    $fields = preg_replace("|(.*)(DITISEENHAAKJEOPENENDITISEENDOLLARTEKENactionDITISEENISISDITISEENQUOT)(.*)(DITISEENQUOTDITISEENHAAKJESLUITEN)(.*)|Uis", "\\3, ", $fields);


Op het eerste gezicht werkt dit aardig, maar in sommige gevallen werkt ie voor geen meter en ik moet zeggen dat ik het een alles behalve nette manier vind, maar dat terzijde.

En ik weet dat er op het forum genoeg topics over pregex zijn, maar aangezien de zoekfuntie nog niet werkt kan ik daar niet echt eerst kijken.

Verwijderd

Topicstarter
Ik heb nog een regex geschreven en die zou als ik het zo bezie 100% moeten werken, maar hij werkt voor maal liefst 0 % :( Wat doe ik verkeerd?
PHP:
1
$fields = preg_replace("|(.*)\((\$action==\\\")(.*)(\\\"\))(.*)|Uis", "\\3,", $php);

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

dannydude:
PHP:
1
$fields = preg_replace("|(.*)\((\$action==\\\")(.*)(\\\"\))(.*)|Uis", "\\3,", $php);
Zou dat niet eerder zo iets moeten zijn
/($action=="[^"]*?")/i
:?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
$fields = preg_replace("/($action==\\\"[^\\\"]*?\\\")/i", "\\3,", $php);

Dit werkt in ieder geval niet (helaas).

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Zou je nog even uit willen leggen wat je nou precies wilt, want ik snap 't niet helemaal...

Je hebt een template met een functie aanroep en een array $args ofzo? Waar haal je die $args vandaan :? En wat gaat die functie doen :? kortom, wat moet nu precies door wat vervangen worden :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Dat was m'n eerste post, daar gaat het nu niet meer om. Het gaat nu om het probleem beschreven in http://gathering.tweakers...message/14653136#14653136. Die problemen staan los van mekaar, maar omdat ze allebei over regexes gaan heb ik het in een topic gehouden. Ik wil dus uit een stuk php alle if ($action==\"val\") filteren, waar alle overige php die er ook in staat verloren gaat en enken val overblijft. Val kan elke waarde hebben en komt meerdere keren voor.

Verwijderd

Topicstarter
Ik denk dat ik nu wel ongeveer weet waar het mis loopt, maar een oplossing weet ik niet.
Ik denk dat hij de \\\" niet goed aanziet voor \", of moeilijk doet vanwege \(, maar een oplossing voor beide dingen weet ik niet...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

't is een goede gewoonte om voor regexes altijd enkele quotes te gebruiken, gezien je dan ongeveer 4x zo weinig hoeft te escapen.

Maar als ik je goed begrijp heb je stukjes PHP die tussen <? en ?> staan, waar je vervolgens alle if ( $action ) == "value" uit wilt filteren, om vervolgens te weten wat "value" is? Waarom laat je je template dan niet gewoon door PHP uitvoeren?

* drm heeft iig het vermoeden dat je idee een beetje brak is :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
dat is het hem nu juist, de code mag/hoeft niet uitgevoerd te worden want ik wil niet weten wat value is, maar ik wil alle mogelijke value's in dat stuk code achterhalen en daar een ander stuk php-code mee genereren. Het is namelijk voor een module builder, die zoals eerder gezegd aan de hand van wat simpele drukken op de knop wat functies insert en een php-bestand genereert. Daarbij is het dus van belang om uit dat stuk php alle if ($action=="value") te halen en daar een extra stuk van te genereren, dat weer in een ander bestand wordt gegooid.

Verwijderd

Topicstarter
Ok het is fixed, dit was de oplossing:
PHP:
1
2
3
    $fields = stripslashes($php);

    preg_match_all('/\$action\s*==\s*"(.*?)"/', $fields, $matches);
Pagina: 1