Werken met Regular Expressions

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Roy Nieterau

Roy Nieterau

22/06/2010 20:58:34
Quote Anchor link
Hey,

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
$message = preg_replace ('/\[code[=A-Za-z]*\]/', $yyy, $message, 1, $amountcodes);
$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
 
PHP hulp

PHP hulp

30/11/2024 12:05:56
 
Martijn B

Martijn B

22/06/2010 21:09:22
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>';

}

?>


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.
Gewijzigd op 22/06/2010 21:21:20 door Martijn B
 
Martijn B

Martijn B

22/06/2010 21:12:45
Quote Anchor link
oops dubbel
Gewijzigd op 22/06/2010 21:13:08 door Martijn B
 
Roy Nieterau

Roy Nieterau

22/06/2010 21:23:41
Quote Anchor link
Hey hartstikke bedankt voor de link EN voor 't stukje script. Ik kan er nog niet helemaal uitkomen "HOE" het werkt, maar het werkt in ieder geval. Ik ga het eens proberen toe te passen zoals ik het wil hebben en dan nog eens proberen uit te pluizen, maar ik heb er de ballen verstand van.

Bedankt in ieder geval. :)
 
Martijn B

Martijn B

22/06/2010 21:30:03
Quote Anchor link
Dit is inderdaad niet bepaald een eenvoudige regex ;P
 
Roy Nieterau

Roy Nieterau

22/06/2010 21:37:06
Quote Anchor link
Toch had ik nog een ander vraagje, misschien ook weer zo'n beginnersfout dat ik het uberhaupt vraag.

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.
 
Martijn B

Martijn B

22/06/2010 21:53:42
Quote Anchor link
Volgens mij moet je toch echt eerst alle [cod]..[/cod] blokken uit de tekst halen.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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(...) .
Gewijzigd op 22/06/2010 22:03:46 door Martijn B
 
Roy Nieterau

Roy Nieterau

22/06/2010 22:01:55
Quote Anchor link
Aaaaa stom! Je kan natuurlijk gewoon die volledige match replacen met de nieuwe string die je hebt opgebouwd met de onderdelen. STOM.

Thanks!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.