Werken met Regular Expressions
Ik heb het werken met regular expressions nog niet helemaal onder de knie, ook al heb ik flink gegoogled en de top hits geprobeerd door te spitten. Het blijft me toch erg lastig.
Ik wil nu bijvoorbeeld
[^code^] (of [^code=XXX^]) replacen met iets anders (voor het gemak even YYY)
en [^/code^] ook vervangen. Dat is me gelukt. (behalve dat ik niet de XXX 'uit de string' weet te halen. Dus dat is mijn eerste vraag. Hoe kan ik het makkelijkste deze XXX weer 'later toepassen' in wat ik replace. Mijn aanpak was zover als volgt:
Code (php)
1
2
2
$message = preg_replace ('/\[code[=A-Za-z]*\]/', $yyy, $message, 1, $amountcodes);
$message = preg_replace ('/\[\/code\]/', $zzz, $message, 1, $amountcodes2);
$message = preg_replace ('/\[\/code\]/', $zzz, $message, 1, $amountcodes2);
En dat deed op zich zijn ding.
Maar nu wil ik ook alles wat tussen deze tags [^code^] en [/^code^] zit gebruiken en daarvan het aantal <br> (of <br/>) tellen en het aantal <p> dat daar in zit.
hoop dat het niet te ingewikkeld klinkt. Blijft moeilijk die regex.
Dus, alvast bedankt!
Roy
*De ^ tekentjes staan ertussen omdat hij het anders als stukjes code ziet. hehe.
Gewijzigd op 22/06/2010 21:06:28 door Roy Nieterau
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
$sContent = '
[cod][/cod]
[cod]...[/cod]..[/cod]
[cod blabla]...[/cod]
';
if( preg_match_all('/\[cod( [^\]]+)?]((?:[^\[]+|\[(?!\/cod]))*+)\[\/cod]/', $sContent, $aMatch) )
{
echo '<pre>'; print_r($aMatch); echo '</pre>';
}
?>
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
$sContent = '
[cod][/cod]
[cod]...[/cod]..[/cod]
[cod blabla]...[/cod]
';
if( preg_match_all('/\[cod( [^\]]+)?]((?:[^\[]+|\[(?!\/cod]))*+)\[\/cod]/', $sContent, $aMatch) )
{
echo '<pre>'; print_r($aMatch); echo '</pre>';
}
?>
Wel van cod code maken...
Uitleg over een regex die vergelijkbaar is vind je hier:
http://wiki.phpfreakz.nl/Regexes:_Veelgemaakte_fouten
Edit:
Meteen een fout ontdekt in phphulp.
Meteen een fout ontdekt in phphulp.
Gewijzigd op 22/06/2010 21:21:20 door Martijn B
Gewijzigd op 22/06/2010 21:13:08 door Martijn B
Bedankt in ieder geval. :)
Dit is inderdaad niet bepaald een eenvoudige regex ;P
Maar hoe kan ik het nu het beste aanpakken als ik bijvoorbeeld het volgende wil doenvan:
[cod=lolly]ik ben een stukje
met line breaks
enzo[/cod]
naar:
<code tag=lolly>ik ben een stukje
met line breaks
enzo</code>
(EN ik wil de line breaks tellen, dus <br> </p> en alles op 'elke' logische mogelijke schrijfwijze, hehe.)
Dit wil ik ook uiteindelijk terug in m'n uiteindelijke 'source' hebben, dus ik moet het echt replacen (voor mijn gevoel, kan ook domme gedachtegang zijn?)
alvast bedankt.
*ondertussen speel ik er nog even mee, hehe.
Dit omdat je ook dingen wil gaan tellen in de blokken.
Om te vervangen zou ik een array maken die gelijk is aan $aMatch[0].
$aMatch[0] = array met volledige match
$aMatch[1] = array met 1e (...) (capturing group) de attributen in [cod[dit dus]]
$aMatch[2] = array met 2e (...) (capturing group) inhoud van het blok
Ik bedoel:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$aReplace = array();
foreach( $aMatch[0] as $iKey => $sBlok )
{
$aReplace[] = '<cod>' . $aMatch[2][ $iKey ] . '</cod>';
}
$sContent = str_replace($aMatch[0], $aReplace, $sContent);
?>
$aReplace = array();
foreach( $aMatch[0] as $iKey => $sBlok )
{
$aReplace[] = '<cod>' . $aMatch[2][ $iKey ] . '</cod>';
}
$sContent = str_replace($aMatch[0], $aReplace, $sContent);
?>
Edit:
Om te tellen zou je deze functie kunnen gebruiken:
http://nl3.php.net/manual/en/function.substr-count.php
Hiervoor nog even ervoor zorgen dan alle <br> en <p> tjes hetzelfde zijn.
Dit zou je kunnen doen met preg_replace(...) .
Om te tellen zou je deze functie kunnen gebruiken:
http://nl3.php.net/manual/en/function.substr-count.php
Hiervoor nog even ervoor zorgen dan alle <br> en <p> tjes hetzelfde zijn.
Dit zou je kunnen doen met preg_replace(...) .
Gewijzigd op 22/06/2010 22:03:46 door Martijn B
Thanks!