Toon posts:

[PHP] gedeelte van een string...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Stel ik heb het volgende:
code:
1
$String = "Dit is {piece} een stukje tekst {/piece} en dit ook";

Mijn vraag is hoe krijg ik het stukje tekst tussen de {pieces} in een apparte variabele?

thnx!

Verwijderd

Op zondag 10 februari 2002 23:53 schreef Donnie het volgende:
Hoi,

Stel ik heb het volgende:
code:
1
$String = "Dit is {piece} een stukje tekst {/piece} en dit ook";

Mijn vraag is hoe krijg ik het stukje tekst tussen de {pieces} in een apparte variabele?

thnx!
reguliere expressie...

  • pimlie
  • Registratie: November 2000
  • Laatst online: 08-09 00:36
zoiets zou denk ik wel moeten werken:
PHP:
1
2
3
4
5
<?
if(ereg("'.*\{piece\}(.*?)\{piece\}.*'", $string, $pieces)) {
  echo $pieces[1];
}
?>

Verwijderd

Topicstarter
Op maandag 11 februari 2002 00:02 schreef pimlie het volgende:
zoiets zou denk ik wel moeten werken:
PHP:
1
2
3
4
5
<?
if(ereg("'.*\{piece\}(.*?)\{piece\}.*'", $string, $pieces)) {
  echo $pieces[1];
}
?>
Warning: REG_BADRPT :'(

  • elnino
  • Registratie: Augustus 2001
  • Laatst online: 03-09 05:13
Op maandag 11 februari 2002 00:02 schreef pimlie het volgende:
zoiets zou denk ik wel moeten werken:
PHP:
1
2
3
4
5
<?
if(ereg("'.*\{piece\}(.*?)\{piece\}.*'", $string, $pieces)) {
  echo $pieces[1];
}
?>
Volgens mij haal je nu twee dingen door elkaar: ereg en preg... Als je de mogelijkheid hebt om PCRE-regexps te gebruiken, raad ik je die aan om te gebruiken, omdat je bij PCRE greediness kunt uitzetten.

Grootste verschillen tussen PCRE (preg) en POSIX (ereg):
  • PCRE heeft altijd zogenaamde delimiters nodig voor én na de expressie, bijvoorbeeld:
    code:
    1
    2
    
    #<b>(.*?)</b>#si
    ^       ^
  • Daarnaast kent PCRE ook nog de zgn. modifiers. Die bepalen of de match case-sensitive of case-insensitive zijn, of er alleen per regel gekeken wordt of door de hele tekst. s en i zijn van zulke modifiers:
    code:
    1
    2
    
    #<b>(.*?)</b>#si
              ^^
  • In PCRE kun je de greediness bepalen. Wat is greediness? Stel je hebt de volgende zin:
    code:
    1
    
    <b>Hallo</b> dit is een <b>zin</b>

    Stel dat je de volgende regexp hebt:
    code:
    1
    
    #<b>(.*)</b>#si

    Greediness staat hier uit, er staat geen vraagteken achter de *.

    Nu wordt het volgende gedeelte gematcht:
    code:
    1
    2
    
    <b>Hallo</b> dit is een <b>zin</b>
       <------------------------->

    Staat greediness uit, dus met een vraagteken achter het sterretje, dan wordt de volgende gedeeltes gematcht:
    code:
    1
    2
    
    <b>Hallo</b> dit is een <b>zin</b>
       <--->             <->
Bij ereg dus geen ? en ook geen delimiters!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Volgens mij gebruikt pimlie PCRE syntax in POSIX regexps. Probeer dit eens
PHP:
1
2
3
4
5
6
<?
if(preg_match(";\\{piece\\}(.*?)\\{piece\\};", $string, $pieces)) 
{  
   echo $pieces[1];
}
?>

non-tested

[edit]hmm elnino had ook al zo'n briljante ingeving :Y)

Verwijderd

Topicstarter
Op maandag 11 februari 2002 00:23 schreef Orphix het volgende:
Volgens mij gebruikt pimlie PCRE syntax in POSIX regexps. Probeer dit eens
PHP:
1
2
3
4
5
6
<?
if(preg_match(";\\{piece\\}(.*?)\\{piece\\};", $string, $pieces)) 
{  
   echo $pieces[1];
}
?>

non-tested

[edit]hmm elnino had ook al zo'n briljante ingeving :Y)
Yep! Dit werkt! Bedankt allemaal voor de goede info! :)

  • elnino
  • Registratie: Augustus 2001
  • Laatst online: 03-09 05:13
Op maandag 11 februari 2002 00:23 schreef Orphix het volgende:
Volgens mij gebruikt pimlie PCRE syntax in POSIX regexps. Probeer dit eens
PHP:
1
2
3
4
5
6
<?
if(preg_match(";\\{piece\\}(.*?)\\{piece\\};", $string, $pieces)) 
{  
   echo $pieces[1];
}
?>

non-tested
Misschien kun je hier beter enkele quotes gebruiken in plaats van dubbele. Anders moet je alles dubbel escapen en dat is niet handig.

edit:
code:
1
if(preg_match(";\\{piece\\}(.*?)\\{piece\\};", $string, $pieces))

Die laatste {piece} moet {/piece} zijn, anders match hij namelijk niet goed.

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op maandag 11 februari 2002 00:23 schreef elnino het volgende:
Greediness staat hier uit, er staat geen vraagteken achter de *.
Mja, wat je noemt is *juist* greedy. Greedy = gulzig = zo veel mogelijk matchen. :)

Verwijderd

Topicstarter
Hoi,

Die code werkt allemaal prima! maar waar blijft het gedeelte na {/piece} ?
code:
1
String = "Dit is {piece} een stukje tekst {/piece} en dit ook";

dus "en dit ook" :?

Thnx! :)

Verwijderd

In de "volgende array" vermoed ik.
Dus $pieces[2] of zoiets.

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

drm

f0pc0dert

Onno:
Mja, wat je noemt is *juist* greedy. Greedy = gulzig = zo veel mogelijk matchen. :)
Je haalt me de woorden uit de mond ;)

Donnie>:
Ikzelf geef de voorkeur aan PCRE omdat uiteindelijk de mogelijkheden veel groter zijn dan bij POSIX extended-regexen. Blader eventjes een beetje door de manual (pcre) om erachter te komen hoe alles precies werkt.

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


Verwijderd

Topicstarter
Nee helaas is het niet daar :'(

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

drm

f0pc0dert

Het gedeelte wat je wilt hebben uit de string is niet aangegeven in de regular expression dus komt ook niet voor in de array.

Ikzelf zou het met een /e -modifier van PCRE oplossen. Deze modifier in preg_replace gebruikt een functie om de zooi te replacen ipv een variabele:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
// voorbeeldje:
function m ()
{
   return "holland";
}

$string = "Hello world";
echo "Before replace: \"$string\"";
preg_replace ( "/o\s(.*)$/e", 'm ( "\\1" )', $string );
echo "After replace: \"$string\"";
?>

Voordeel is dat je op die manier heel eenvoudig je originele string kunt bewaren, en dat je in de function je variabelen kunt bewaren

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


Verwijderd

Op maandag 11 februari 2002 10:41 schreef Donnie het volgende:
Nee helaas is het niet daar :'(
Nee sorry, tuurlijk niet. DOM DOM DOM... |:(
Wat preg_match doet is de tekst tussen de {pieces} en {/pieces} matchen.
De string blijft hetzelfde. Dus je hebt nu allen de array pieces. Wat je dus moet doen (als je ook wat wilt doen met je tekst) is preg_replacen. Maar dat was je vraag niet.
Wat wil je nu precies?
met explode of substr kun je ook aan de gang gaan, alhoewel me dat wat omslachtig lijkt.
Leg even precies uit wat je wilt dude, I don't follow.

Verwijderd

Topicstarter
Op maandag 11 februari 2002 10:47 schreef daniel_hoenderdos het volgende:

[..]

Nee sorry, tuurlijk niet. DOM DOM DOM... |:(
Wat preg_match doet is de tekst tussen de {pieces} en {/pieces} matchen.
De string blijft hetzelfde. Dus je hebt nu allen de array pieces. Wat je dus moet doen (als je ook wat wilt doen met je tekst) is preg_replacen. Maar dat was je vraag niet.
Wat wil je nu precies?
met explode of substr kun je ook aan de gang gaan, alhoewel me dat wat omslachtig lijkt.
Leg even precies uit wat je wilt dude, I don't follow.
Ja omslachtig is het wel. Maar met explode werkt het nu iig wel :) - tot nu toe dan

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

Ik blijf weinig van dit soort dingen snappen. Helaas moet ik zeggen aangezien ik wel zie en weet dat het kracht heeft!

Weet iemand dan ook een pagina die het _goed_ uitlegd zoals elnino het doet? Liefst in nederlands omdat er al zulke moeilijke woorden gebruik worden ;)

Want ik weet al een paar dingen die ik hiermee kan maken..waarschijnlijk heel simpel zijn, als je weet hoe het werkt; maar dat weet ik dus niet ;(. En ik ga niet die source hier vragen; wil er van leren :P

Alvast onwijs bedankt!!

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

drm

f0pc0dert

Donnie:
Ja omslachtig is het wel. Maar met explode werkt het nu iig wel :) - tot nu toe dan
Da's helemaal niet nodig. preg_replace al geprobeerd?

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


Verwijderd

Topicstarter
Op maandag 11 februari 2002 11:02 schreef drm het volgende:

[..]

Da's helemaal niet nodig. preg_replace al geprobeerd?
Ja, maar helaas, nu is mijn ervaring met deze functies ook niet echt zo optimaal.

Wat mijn bedoeling is is zoiets als het quote systeem van dit forum. quoten werkt prima, maar wanneer er een bericht wordt ge-quote met daarin een quote dan moet die quote [..] in dit veranderen.

Misshien weten jullie hiervoor een goede manier?

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

Op maandag 11 februari 2002 11:08 schreef Donnie het volgende:

[..]

Ja, maar helaas, nu is mijn ervaring met deze functies ook niet echt zo optimaal.

Wat mijn bedoeling is is zoiets als het quote systeem van dit forum. quoten werkt prima, maar wanneer er een bericht wordt ge-quote met daarin een quote dan moet die quote [..] in dit veranderen.

Misshien weten jullie hiervoor een goede manier?
Voordat je zelf er een QUOTE gedeelte omheen gaat gooien eerst alles binnen de QUOTE's naar [...] veranderen.

pseudo:

[ quote]
$sOudeText
[ /quote]

waar je in de $sOudeText dus alle QUOTE's veranderd naar [...] (+ hun inhoudt)

Verwijderd

Topicstarter
Op maandag 11 februari 2002 11:14 schreef Mir het volgende:

[..]

Voordat je zelf er een QUOTE gedeelte omheen gaat gooien eerst alles binnen de QUOTE's naar [...] veranderen.

pseudo:

[ quote]
$sOudeText
[ /quote]

waar je in de $sOudeText dus alle QUOTE's veranderd naar [...] (+ hun inhoudt)
Ok, dat werkt. Maar om de 1 of andere reden werkt het niet als ik een bericht quote die al een [..] erin heeft staan :?
De string die verander moet worden is identiek aan de andere.. mm

*zoekt probleem*

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

ergens zie ik niet in waarom dat niet zou werken :P

Het is toch gewoon text net als alle andere zinnen?

Misschien even aangeven wat er fout gaat?

• Wat stop je erin
• Wat doe je ermee
• Wat kom eruit (eventuele foutmelding, of verkeerde output

Verwijderd

Topicstarter
x: En hier gaan we weer...

y: {quote}x schreef het volgende:En hier gaan we weer... {/quote}

Tja...


{quote}y schreef het volgende: [..] Tja...{/quote}

en hier weer een stukje tekst.
--------------------------------------------------------
Luister en huiver ;)

X post een bericht ("En hier gaan we weer...")

Y quote X zijn bericht en voegt toe Tja...

//---Tot dusver allemaal goed.

Als ik nu het bericht van Y wil quoten dan gaat het mis ??
Dan wordt de [..] weer veranderd in de originele quote :?

Vreemd.

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

drm

f0pc0dert

post de code eens?

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


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$Quote_Result = "[quote]bla bla bla [..] bla bla [/quote] bla blaat";

if(preg_match(";\\\[quote\\](.*?)\\\[\/quote\\];", $Quote_Result, $pieces))

    {
        $Quote_String = $Quote_Result;

        $explode = explode("[/quote]",$Quote_String);

    
                                    $pieces[0] = "[..]";

        $Quote_Result = $pieces[0];


    }

Zoiets dus.

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

drm

f0pc0dert

dat doe je dus anders. Zoals ik al zei, kun je beter een preg_replace -aanroep doen met de /e modifier:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
$str[0] = "[quote]Dit is een quote[/quote]";
$str[1] = "[quote]Dit is een quote met een [..] erin[/quote]";
function quote ( $str )
{
   // doe hier alles wat je wilt met $str
   return "<htmlmeeuk die je eromheen wilt zetten enzo>$str</htmlmeuk>";
}

for ( $a = 0; $a < count ( $str ); $a ++ )
{
   $str [$a] = preg_replace ( "/\\[quote\]((.|\n))*\\[\/quote\]/e", 'quote ( "\\1" )', $str[$a] );
}
echo "<h5>Resultaten:</h5><pre>";
var_dump ( $str );
echo "</pre>";
?>

zoiets

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


Verwijderd

Topicstarter
Ah ok thnx! Het werkt idd :)
code:
1
2
3
4
5
6
function quote ( $Quote_Result)
                {   
                    return "[..]";
                }
                        $Quote_Result = preg_replace ( "/\\[quote\]((.|\n))*\\[\/quote\]/e", 'quote ( "\\1" )', $Quote_Result);
[b]zo dus[/b]

Ik heb even hier en daar wat documentatie opgezocht over preg_replace met zijn gekke attributen ;) en het is me nu duidelijk!

Thnx! :D
Pagina: 1