Regex hulp
Dit is de volledige tag:
{module:agenda:params(null, null)}
Nu lukt het mij wel om de volledige tag uit elkaar te halen.
Alleen nu wil ik $array[2] gaan regexen.
Ik wil dus weten wat er tussen params( ) zit.
Wie kan me erbij helpen, heb al meerdere dingen geprobeerd maar regex blijft een HELL.
Alvast bedankt.
In zo'n geval denk je eerst, ik moet het gedeelte tussen param() zit en daarna die string opsplitsen bij de ,. Dat wordt dan:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$str = 'param(null, "foo", true, null)';
preg_match('{
# match "param("
param\(
# alles tussen de haakjes
(.+?)
# sluithaakje
\)
# x flag zorgt dat alle whitespace en comments niet in de regex worden opgenomen
}x', $str, $ms);
$params = explode(', ', $ms[1]);
?>
$str = 'param(null, "foo", true, null)';
preg_match('{
# match "param("
param\(
# alles tussen de haakjes
(.+?)
# sluithaakje
\)
# x flag zorgt dat alle whitespace en comments niet in de regex worden opgenomen
}x', $str, $ms);
$params = explode(', ', $ms[1]);
?>
Dit kan, maar het kan mooier.
Meer ervaren regexers zullen anders naar zo'n string kijken. In plaats van naar het hele geheel te kijken kijken ze naar het gedeelte dat ze moeten matchen. In jouw geval wil je het woord na 'param(' matchen totaan de volgende komma, je wilt elk woord tussen 2 komma's matchen en je wilt het woord voor ) matchen. Dit alles kan je in 1 regex stoppen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$str = 'params(null, true, "Foo", null)';
preg_match_all('{
# [^,]+ betekend alles wat geen komma is
# (?<=...) is een look behind. Dit betekend dat het gedeelte op de 3 puntjes
# gematched moet worden voor de rest van de regex, maar dat hij niet meegenomen
# wordt in de match
# matches "null" in "params(null"
(?<=params\()[^,]+
| # dit is het scheidingsteken
# (?=...) is een look ahead, zelfde als look behind maar dan voor erachter
# matches "null" in " null)"
(?<= )[^,]+(?=\))
|
# matches "true" in ", true" and ""foo"" in ", "foo""
(?<=, )[^,]+
}x', $str, $matches);
$params = $matches[0];
?>
$str = 'params(null, true, "Foo", null)';
preg_match_all('{
# [^,]+ betekend alles wat geen komma is
# (?<=...) is een look behind. Dit betekend dat het gedeelte op de 3 puntjes
# gematched moet worden voor de rest van de regex, maar dat hij niet meegenomen
# wordt in de match
# matches "null" in "params(null"
(?<=params\()[^,]+
| # dit is het scheidingsteken
# (?=...) is een look ahead, zelfde als look behind maar dan voor erachter
# matches "null" in " null)"
(?<= )[^,]+(?=\))
|
# matches "true" in ", true" and ""foo"" in ", "foo""
(?<=, )[^,]+
}x', $str, $matches);
$params = $matches[0];
?>
Je ziet dat ik de volgorde wat heb omgedraaid, omdat anders de versie voor het haakje op het eind nooit zou worden gebruikt, omdat de gene die alles vanaf het haakje match hier al zou matchen
Gewijzigd op 08/08/2013 23:45:58 door Wouter J
Damn, dit moet ik ff goed lezen en begrijpen.
Ik ben idd een regex beginner, heb me er vaker aan gewaagd maar het is echt facking klote als iemand het je kan uitleggen.
Jou uitleg is ZEKER wel uitgebreid, nu nog kijken of ik er wat van kan snappen.
Alvast bedankt en wellicht heb ik nog een vraagje voor je.
Een goeienacht alvast gewenst Wouter.
Toevoeging op 09/08/2013 00:15:32:
Kerel jij bent echt pro in regex.
Het is een onwijs mooie tool van PHP, degene die dit ook heeft ontwikkeld moet zeker wel een autist zijn geweest want je moet echt een mega brein hebben.
De werkt wel wat je aangeeft en de 2e manier is echt waaayyy ahead of me.
Je uitleg is wel rete goed, je legt exact uit wat je doet en ik begrijp het ook wel redelijk.
Maar bij de 2e optie is het enige wat ik zie staan ... #^(#*()^..*#^*(#^* hahaha
Toch super bedankt, en ik ga er zeker ook wel mee oefenen.
Dit zal niet de laatste keer zijn dat is een "module" tag of iets wil maken.
De php oreg library is de php port van de pcre library, welke origineel uit perl komt en wordt gebruikt in veel talen. Het is dus niet slechts een php tool
[/nerd mode]
Jan
Jan R op 09/08/2013 07:12:15:
net zoals de q&a toppic welke hier resent werd gestart
Waar dan?
- SanThe - op 09/08/2013 07:16:29:
Waar dan?
Jan R op 09/08/2013 07:12:15:
net zoals de q&a toppic welke hier resent werd gestart
Waar dan?
http://www.phphulp.nl/php/forum/topic/q-en-a-sql-injecties/91714/
Als ik nu maar 1 param meegeef zonder komma's enzo dan gaat het mis..
{module:agenda:getlist:params(2)}
Ik heb al zitten rotzooien maar ik maak het alleen maar kapot hahah
Zou je mij nog een keer uit de brand kennen helpen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$str = 'params(nul)';
preg_match_all('{
# matches "null" in " null)"
(?<=\s)[^,]+(?=\))
|
# matches "null" in "(null)"
(?<=\()[^,]+(?=\))
|
# matches "null" in "params(null"
(?<=params\()[^,]+
|
# matches "true" in ", true" and ""foo"" in ", "foo""
(?<=,\s)[^,]+
}x', $str, $matches);
$params = $matches[0];
?>
$str = 'params(nul)';
preg_match_all('{
# matches "null" in " null)"
(?<=\s)[^,]+(?=\))
|
# matches "null" in "(null)"
(?<=\()[^,]+(?=\))
|
# matches "null" in "params(null"
(?<=params\()[^,]+
|
# matches "true" in ", true" and ""foo"" in ", "foo""
(?<=,\s)[^,]+
}x', $str, $matches);
$params = $matches[0];
?>
Aanpassingen: spaties vervangen door \s (doordat we de x flag gebruiken), de volgorde wat veranderd, comments verwijderd en een rule voor (iets) toegevoegd
Gewijzigd op 18/08/2013 19:10:47 door Wouter J
Ik heb weer een probleem ermee.
Deze waarde krijg ik nu terug en eigenlijk moeten er 2 waardes zijn of indien ik dat aangeef meer waardes.
{{module:menu:params(shop-artists, shop-artists)}}