[php] replace aBc waarbij B onbekend

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Justice
  • Registratie: Maart 2001
  • Laatst online: 07-08 15:02
Ik wil een aantal keer string 'aBc' vervangen waarbij
B een onbekende lengte en inhoud heeft
a en c bekend zijn

Ik heb zitten knutselen met str_replace maar door onbekende B kon ik daar niets mee.

Nu ben ik er achter gekomen dat ik dus waarschijnlijk regular expressions moet gaan gebruiken doordat ik B niet kan raden, en omdat ik de hele string aBc wil vervangen, niet alleen a en c.

Echter ben ik geen expert ermee, en heb ik gezocht op GoT naar regular expressions en het vervangen van onbekenden, maar alle topics in de search gaan over aBc waarbij a en c onbekend zijn, en B bekend. Dit is dus precies het omgekeerde van mijn geval.

Mijn code is versimpliceerd tot:
PHP:
1
2
3
    $a='blabla';
    $c='bleble';
    $data_array[$i] = preg_replace('($a.*?$c)', '', $data_array[$i]);


Hierbij stuit ik op 2 problemen:
*Volgens mijn syntax editor worden variabelen $a en $c niet vervangen door de strings, kan dit of moet ik de strings echt erin zetten (ze zijn nogal groot, dus de opmaak wordt er niet netter door).
*De regular expression werkt niet, er wordt niets vervangen. Ik heb 'm verkeerd omgewerkt en ik heb niet genoeg kennis om er eentje van scratch te schrijven.

Enige tips en ideen hoe dit te doen is? Het duizelt mijn voor de ogen wb regular expressions. :)

Human Bobby


Acties:
  • 0 Henk 'm!

  • Luxx
  • Registratie: Februari 2001
  • Laatst online: 20-05 12:47

Luxx

Hijs nu het zeil gezwind...

Kan je niet eerst de string stuk knippen. Dan knip je eerst A en C er af ( stringlengte kun je wel bepalen, toch), vervolgens plak je de juiste delen in juiste volgorde weer aan elkaar.

HYEHEHEHEEHHEEHee, hier had iets zinnigs kunnen staan, maar dat is niet.


Acties:
  • 0 Henk 'm!

  • Justice
  • Registratie: Maart 2001
  • Laatst online: 07-08 15:02
Als ik a en c eraf knip kan ik niet bepalen waar B zich bevind, omdat aBc onderdeel van een item is (item op website = data_array[$i].

Met andere woorden: uit data_array[$i] (die wordt doorlopen) moet ik steeds het onderdeel aBc replacen, waarbij B verandelijk is.

Human Bobby


Acties:
  • 0 Henk 'm!

Verwijderd


als je op een linux box zit met perl en man pages geinstalerd kan ik je aanraden "man perlre" eens door te lezen.
op het internet is ook hopen info te vinden over reguliere expressies. handig om dan te weten is dat reguliere expressies vaak word afgekort tot, regex of regexp.

jouw regex
'($a.*?$c)' zegt nu
de string moet bevatten $a dan mag er elk teken komen, dat teken mag 0 of ongelimiteerd keer voorkomen en dat mag 1 of 0 keer voorkomen. daarna aansluitend moet $c voor komen.

ik weet niet of die ? je regex "kapot" maakt of dat het niet uit maakt.

de ( en ) worden meestal gebruikt om een clustering aan te geven. (iets waar ik toegegeven nog weinig tijd in heb gestoken en dus geen flikker van af weet)
traditsioneel zet je een regex binnen / en /

-edit-
net hier gelezen dat je ( en ) ook als delimiter mag gebruiken. dus never mind dit :)


voor wat jij zou willen doen is
/$a.*$c/
hetgeen ik zou pakken.
of als je weet dat er altijd iets tussen $a en $c zal zitten. of moet zitten.
/$a.+$c/


ok heb dus nog even verder gezocht dan mijn neus lang is. en kwam er achter dat ? gebruikt word om na een constructie als b.v..* gebruikt word om de kleinst mogelijke isantie te vinden.

in andere woorden. negeer deze post lekker :)
zover ik kan zien is je regex gewoon goed en hoort hij te werken.

erger dan dat nog, doordat ik er nu achter kwam wat ? nog meer doet.
kreeg ik nu eindelijk een progje van mezelf werkend :P

[ Voor 39% gewijzigd door Verwijderd op 19-01-2004 02:53 ]


Acties:
  • 0 Henk 'm!

  • benoni
  • Registratie: November 2003
  • Niet online
Niet meteen alles doorstrepen!

Volgens mij is het ook slashes ipv. haakjes. Met die haakjesparen laat je de Regexp functie iets onthouden, zodat je dat later weer kunt oproepen met \1 \2 enz.

Acties:
  • 0 Henk 'm!

  • 4VAlien
  • Registratie: November 2000
  • Laatst online: 24-06 09:47

4VAlien

Intarweb!

reguliere expressies met http://nl.php.net/preg_replace ofzo, het vereist ff lezen maar dan kom je een stuk verder dan met strreplace!

Acties:
  • 0 Henk 'm!

  • benoni
  • Registratie: November 2003
  • Niet online
PHP:
1
2
3
4
5
6
7
8
9
<?
    $text = 'jajajablablaenenenblebleneeneenee';
    $a = 'blabla';
    $c = 'bleble';
    $preg = '/'. $a . '.*?' . $c . '/';
    print($preg . '<br/>');
    $text = preg_replace($preg,'',$text); 
    print($text . '<br/>');
?>


edit: ff de <br>etjes netjes <br/> gemaakt.
addit: als er gekke tekens in $a en $c kunnen zitten moet je ze ook escapen, anders gaat 't nog mis.

[ Voor 65% gewijzigd door benoni op 19-01-2004 04:36 ]


Acties:
  • 0 Henk 'm!

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Justice schreef op 19 januari 2004 @ 01:54:
(...) regular expressions moet gaan gebruiken (...) geen expert (...)
Je bent blijkbaar ook niet echt een php-expert, anders had je deze pagina wel eens onder ogen gehad ;) Dubbele kwootjes dus, en dan zou 'ie best eens kunnen werken :)
PHP:
1
    $data_array[$i] = preg_replace("/$a.*?$c/", "", $data_array[$i]);
De haakjes (je delimiters) zie ik trouwens liever als slashes wegens portable, maar dat is gemierenn**k.

Voor benoni: zie hier: "Since PHP 4.0.4, you can also use Perl-style (), {}, [], and <> matching delimiters."

De site die 4VAlien al aandraagt - www.php.net - is natuurlijk verplichte kost. Op dezelfde site even de pagina over pattern syntax (en eventueel pattern modifiers) lezen, en je bouwt perfecte regexpen :)

edit:
Schrijf je eens om half vijf een behulpzaam antwoord, is iemand je voor, en zijn oplossing is nog óók goed ook :( :) Maar de mijne is lekker korter 8)

[ Voor 25% gewijzigd door Rataplan op 19-01-2004 04:37 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


Acties:
  • 0 Henk 'm!

  • benoni
  • Registratie: November 2003
  • Niet online
Helemaal gelijk! Goeiemorgen, ik had het ook niet meer zo goed in de gaten...

Addit: Lijkt me wel wat onhandig om () te gebruiken om je regexp heen als je in de meeste gevallen ook () binnen je regexp gebruikt. Je zou die laatste wel kunnen \( escapen maar dan leest ie 't waarschijnlijk als echte-tekst-haakjes. :( Maar goed 't is leuk dat 't kan.

More2add2it: Oh zoiets schreef je al Rataplan... trouwens bedankt voor je linkjes, ik was wat vastgeroest in de regexps ala js, perl enzo en nu ik deze pagina's eens goed doorspit zie ik dat je exclusief in PHP er een paar reuze handige functies bij hebt. Hoi :D

[ Voor 95% gewijzigd door benoni op 19-01-2004 05:15 ]


Acties:
  • 0 Henk 'm!

  • Justice
  • Registratie: Maart 2001
  • Laatst online: 07-08 15:02
Allemaal heel erg bedankt, het is gelukt door middel van
PHP:
1
2
    $preg = "/$a.*?$c/";
    $data_array[$i] = preg_replace($preg, "", $data_array[$i]);

$a en $c bevatte wat vreemde tekens, na escapen werkt dit perfect. Mooi om te zien dat ik niet de enige ben die iets leert van dit topic ;)

Human Bobby

Pagina: 1