[PHP/RegExp] Gedeelte van een string weglaten/filteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een vraag, ik heb een string met allemaal namen en bijbehorende e-mailadressen. Nou wil ik alleen dat als er een bepaald e-mailadres in voorkomt, dat deze weggelaten wordt.

Het emailadres = $email = bijvoorbeeld: bla2@bla.nl

De string ziet er zo uit: Meneer Bla <bla@bla.nl>, Mevrouw Bla <bla2@bla.nl>, Enzovoort Enz <enz@enzovoort.nl>

Nu wil ik dat het stuk wat bla2@bla.nl bevat verwijderd wordt, dus het hele gedeelte tussen de komma's inclusief 1 komma.

Ik dacht (na enig zoeken) aan:

$string = str_replace(",/(([a-z]|[A-Z]|[0-9]|[_\-.])*<".$email.">", "", $string);

Maar het werkt niet, iemand enig idee?

Bijkomend probleem is dat als het het begin van de string is, er geen komma staat, zodat er niet een komma als eikpunt gebruikt kan worden :?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je gebruikt str_replace, en str_replace ondersteunt natuurlijk geen regexps. Je moet preg_replace hebben. ;) En volgens mij begrijp je niet helemaal hoe character classes werken. :P Wat jij hebt geschreven kan veel korter:
PHP:
1
$string = preg_replace("#[a-z0-9_.-]* <".$email.">#iU", "", $string);

Echter, daarmee is je probleem nog niet opgelost. Wat je wel zou kunnen doen:
PHP:
1
2
3
4
5
6
7
8
$array = explode(',', $string);
$result = array();
foreach ($array as $adres) {
  if (strpos($adres, '<'.$email.'>') === false) {
    $result[] = $adres;
  }
}
$string = implode(',', $result);

Eerst zet je alle mailadressen inclusief de bijbehorende namen in een array, en vervolgens loop je dat array af om te kijken of die string erin voorkomt. Geen regexp nodig. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Ik zou eerst proberen alle individuele email adressen uit de string te halen en in een array te stoppen en daarna de string opnieuw bouwen zonder het speciifieke email adres.

Hou er ook rekening mee dat email adressen parsen erg lastig is. Het kan simpel zijn als je zelf de lijst met email adressen aanleverd maar als je het uit een email header trekt dan zijn er erg veel verschillende vormen van geldige email adressen.

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
-NMe- schreef op vrijdag 10 maart 2006 @ 01:19:
$string = implode(',', $result);
Eerst zet je alle mailadressen inclusief de bijbehorende namen in een array, en vervolgens loop je dat array af om te kijken of die string erin voorkomt. Geen regexp nodig. ;)
Dat is de ideale oplossing mits er geen adressen zoals "Achternaam, Voornaam" <mailbox@domain.tld> voorkomen.

[ Voor 5% gewijzigd door stekkel op 10-03-2006 11:45 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op vrijdag 10 maart 2006 @ 01:19:
Je gebruikt str_replace, en str_replace ondersteunt natuurlijk geen regexps. Je moet preg_replace hebben. ;) En volgens mij begrijp je niet helemaal hoe character classes werken. :P Wat jij hebt geschreven kan veel korter:
PHP:
1
$string = preg_replace("#[a-z0-9_.-]* <".$email.">#iU", "", $string);

Echter, daarmee is je probleem nog niet opgelost. Wat je wel zou kunnen doen:
PHP:
1
2
3
4
5
6
7
8
$array = explode(',', $string);
$result = array();
foreach ($array as $adres) {
  if (strpos($adres, '<'.$email.'>') === false) {
    $result[] = $adres;
  }
}
$string = implode(',', $result);

Eerst zet je alle mailadressen inclusief de bijbehorende namen in een array, en vervolgens loop je dat array af om te kijken of die string erin voorkomt. Geen regexp nodig. ;)
Geweldig!

Het werkt (wel 1 "=" teveel bij "== false") maar dat was zo opgelost!

Heel erg bedankt. En inderdaad, ik ben een redelijke newbe met PHP :)

[ Voor 75% gewijzigd door Verwijderd op 10-03-2006 11:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
stekkel schreef op vrijdag 10 maart 2006 @ 11:44:
[...]


Dat is de ideale oplossing mits er geen adressen zoals "Achternaam, Voornaam" <mailbox@domain.tld> voorkomen.
Je hebt gelijk, maar ik heb de namen met komma's al gefilterd. Minder mooie oplossing, maar daar ga ik nog wel een keer een oplossing op verzinnen!

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Verwijderd schreef op vrijdag 10 maart 2006 @ 11:49:
[...]


Geweldig!

Het werkt (wel 1 "=" teveel bij "== false") maar dat was zo opgelost!

Heel erg bedankt. En inderdaad, ik ben een redelijke newbe met PHP :)
Volgens mij niet. Kijk maar wat er gebeurd als "<" op positie 0 staat ....

Dus === is correct.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oeps, ja, zo'n newby ben ik dus :D

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

stekkel schreef op vrijdag 10 maart 2006 @ 11:44:
Dat is de ideale oplossing mits er geen adressen zoals "Achternaam, Voornaam" <mailbox@domain.tld> voorkomen.
Dan kun je splitsen op ">,", maar dat betekent wel dat er een > na elk adres moet worden toegevoegd. Daarnaast is zelfs dat niet waterdicht, aangezien die combi ook kan voorkomen als naam, mits tussen quotes. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1