[PHP] String filteren met str(i)pos

Pagina: 1
Acties:
  • 934 views

Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik wil een string die bestaan uit een regel tekst van 160 tekens filteren.

Ik ben een totale PHP beginner, dus ik zoek wat aanknopingspunten. Helaas moet ik jullie hulp weer inroepen omdat ik na 3 uur Googlen niet veel wijzen ben geworden. Ik zoek denk ik niet goed omdat ik niet weet waarop ik moet zoeken.

Wat ik nu heb:

Knip uit code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if ($from == "afzender@bla.bla") {

// edit email

$cut = split(" - ", $message);
$sms = substr($cut[2],0,160);

// filter email

if (stripos($sms, "BLA1") === false) {
if (stripos($sms, "BLA2") === false) {
if (stripos($sms, "BLA3") === false) {

// send email

mail("geadresseerde@bla.bla","onderwerp",$sms);

}
}
}
}

Hiermee zorg ik dat de string waarin BLA1, BLA2 of BLA3 voorkomt, niet worden gemailed.

De output van stripos (of de case sensitive strpos) is echter altijd FALSE. Ik wil echter nog een BLA4 toevoegen, waarbij het bericht wel doorgelaten moet worden, die door BLA1, BLA2 of BLA3 worden tegengehouden.

Voorbeelden:

BLA1 BLA BLA BLA
Moet worden tegengehouden.

BLA1 BLA BLA BLA4
Moet worden doorgelaten.

Het kan echter ook een combinatie zijn:

BLA1 BLA2 BLA BLA4
Welke ook moet worden doorgelaten.

Wie helpt mij op weg?

Edit:

Of kan ik beter een alternatief voor strpos gebruiken?

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
stripos stuurt een false terug omdat er geen match te vinden is, graag zou ik wat meer informatie willen hebben wat je reeds hebt geprobeerd (uitgebreid) plus de output van $message, dan kan iedereen je beter helpen. :)

Plus ik denk dat je if notatie iets makkelijker kan:
PHP:
1
2
3
if(stripos($sms, "BLA1") || stripos($sms, "BLA2") || stripos($sms, "BLA3") === false) {
   /* Dit doet je code nu in feite */
}

Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik zal wat meer achtergrondinformatie geven:

Het script stuurt P2000 alarmeringen per SMS naar mijn telefoon. Omdat ik voor elk wissewasje een bericht krijg (kat in de boom, liftopsluiting, enz) wil ik dit beperken tot grotere meldingen. Dit om de kosten in de hand te houden. (Anders zo'n 60 euro aan SMS berichten per jaar)

Een melding kan zijn (uit $message):

P 1 AUTOBRAND STRAAT WOONPLAATS
Welke ik dus wil ontvangen.

P 2 KAT IN DE BOOM STRAAT WOONPLAATS
Welke ik niet wil ontvangen.

P 1 = spoed
P 2 = geen spoed

Ongeveer de helft van alle berichten betreft een OMS (openbaar meld systeem) of PAC (particuliere alarm centrale). De melding ziet er dan als volgt uit:

P 1 OMS-BRANDALARM STRAAT WOONPLAATS

of

P 1 PAC-BRANDALARM STRAAT WOONPLAATS

Alle meldingen met "P 2", "OMS-BRANDALARM" en "PAC-BRANDALARM" wil ik eruit filteren. Het script kan dit al.

Maar wat ook kan gebeuren (zeldzaam) is dat een OMS'je opgeschaald wordt:

P 1 OMS-BRANDALARM STRAAT WOONPLAATS (Opschaling: grote brand)

Dat zelfde geldt voor PAC-BRANDALARM en P 2 meldingen.

Dus wanneer het woord "opschaling" in een in eerste instantie tegengehouden bericht voorkomt, moet deze wél worden doorgelaten.

Wat ik zelf heb geprobeerd? Vrij weinig omdat ik vast zit na uren zoeken op internet en niks kunnen vinden.

Edit:

Was weer aan het zoeken op Google en nu vond ik mijn eigen topic bovenin de lijst. :o

[ Voor 3% gewijzigd door F4T4L_3RR0R op 06-07-2009 04:23 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dit heeft weinig met string filteren te maken, maar alles met logica. Ik denk dat je hier zo'n soort logica wil hebben:
PHP:
1
2
3
if (bla4 || !(bla1 || bla2 || bla3)) {
   //send email
}

Dus alles doorlaten waar bla4 in voorkomt. Als dat niet zo is (||), alles doorlaten waar geen (!) bla1 of (||) bla2 of (||) bla3 in voorkomt. Dit kun je ook anders schrijven trouwens, volgens de wetten van De Morgan:
PHP:
1
2
3
if (bla4 || (!bla1 && !bla2 && !bla3)) {
   //send email
}

En die bla's staan natuurlijk voor iets als (stripos($sms, "opschaling") !== false)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Niet alleen doorlaten waar bla4 in voorkomt.

Ook andere tekst moeten doorgelaten worden.

Echter, het filteren op bla1, bla2 en bla3, moet niet van toepassing zijn als bla4 van toepassing is.

Edit:

Ik heb nu 10 uur achter elkaar zitten Googlen zonder resultaat. Ik ga maar eens slapen... :O

[ Voor 21% gewijzigd door F4T4L_3RR0R op 06-07-2009 07:31 ]


Acties:
  • 0 Henk 'm!

  • Apen-nootjes
  • Registratie: September 2001
  • Laatst online: 03-04 12:48

Apen-nootjes

aka Apen-klootjes

En dat is dus precies wat pedorus je aanreikt :) Stukje logica idd :)

Als bla4 van toepassing is, dan wordt die conditie al true en gaat hij door, anders gaat hij kijken of bla1, bla2, of bla3 niet van toepassing is :) Precies wat jij wil, probeer het maar eens uit ;)

SmartDoDo: Ach, afhankelijk van je smaak kan het best een lekker geil ding zijn :P
You never had a date you couldn't inflate


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik heb nu het volgende geprobeerd:
if (stripos($sms, "BLA4") || (stripos($sms, "!BLA1") && stripos($sms, "!BLA2") && tripos($sms, "!BLA3")) !== false) {
Dan laat hij niets door.
if (stripos($sms, "BLA4") || (stripos($sms, "!BLA1") && stripos($sms, "!BLA2") && tripos($sms, "!BLA3")) === false) {
Dan laat hij alles door.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kijk eens naar de haakjes. Komaan zeg; dit is echt basic.
Verder zie ik "tripos" maar dat zal wel een typo zijn? En waarom debug je niet? (Debuggen: Hoe doe ik dat?)

[ Voor 40% gewijzigd door RobIII op 06-07-2009 15:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
En denk eens na waar die uitroepteken moet. Bovendien moet je bij strpos altijd stilstaan bij het verschil tussen 0 en false.

{signature}


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 09:59

remco_k

een cassettebandje was genoeg

En misschien is het uiteindelijk beter en zelfs makkelijker om het met regular expressions te doen.
http://us3.php.net/manual/en/book.regex.php

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Kom alsjeblieft eens niet met die suggestie zolang ts de basics nog niet onder de knie heeft. :X En tot nu toe zijn er enkel requirements langsgekomen welke prima middels de simpele strpos() functies kunnen.

{signature}


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Stripos (PHP 5) is zeker geen typo. Dit is de case insensitive variant van strpos (PHP 4).

Ik heb de haakjes ( ) letterlijk overgenomen uit het voorbeeld van pedorus.

[ Voor 31% gewijzigd door F4T4L_3RR0R op 06-07-2009 16:08 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

F4T4L_3RR0R schreef op maandag 06 juli 2009 @ 15:51:
Ik heb nu het volgende geprobeerd:

[...]

Dan laat hij niets door.

[...]

Dan laat hij alles door.
Als je niet weet wat een ! doet dan stel ik voor dat je eerst eens in de manual gaat kijken in het stukje over operators. Logical operators om precies te zijn. In een literal string heeft een ! natuurlijk geen effect. 8)7
F4T4L_3RR0R schreef op maandag 06 juli 2009 @ 16:07:
Stripos (PHP 5) is zeker geen typo. Dit is de case insensitive variant van strpos (PHP 4).
tripos bestaat echter niet. ;)
Ik heb de haakjes ( ) letterlijk overgenomen uit het voorbeeld van pedorus.
De haakjes wel, de uitroeptekens niet. Nogmaals: handleiding. ;)

[ Voor 30% gewijzigd door NMe op 06-07-2009 16:11 ]

'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!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 09:59

remco_k

een cassettebandje was genoeg

F4T4L_3RR0R schreef op maandag 06 juli 2009 @ 16:07:
Ik heb de haakjes ( ) letterlijk overgenomen uit het voorbeeld van pedorus.
Los van het feit of de locatie van die haakjes nou wel of niet kloppen, is het eigenlijk de bedoeling dat je snapt waarom ze er staan.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Even denken:

!== laat alles door.
=== laat niets door.

Wanneer BLA1, BLA2 of BLA3 in de string voorkomt, laat hij die niet door d.m.v. ===, echter wanneer BLA4 wel in de string voorkomt, moet === veranderd worden in !==.

Denk ik nu goed?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Sorry hoor. Maar wordt het nu echt niet eens tijd voor een fatsoenlijke PHP tutorual i.c.m. met wat basis programmeerzaken (zoals booleaanse logica). Dit is echt *DE* basis van programmeren. Die kan je prima zelf onder de knie krijgen. Als dat echt niet lukt geeft dat niet maar dan moet je niet van programmeren je hobby of werk maken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Nee. Begin maar eens helemaal bij het begin

(stripos(iets) === false) => is waar als het er niet staat
(stripos(iets) !== false) => is waar als het er wel in staat

Dit is wat lastig door de belabberde implementatie van de stripos functie, maar goed

Waar je DAARNAAST nog eens even over moet nadenken is

(a && b) => is waar wanneer A en B beiden waar zijn.
(a || b) => is niet waar wanneer A en B beiden niet waar zijn.

Ga met deze kennis nog eens even kijken naar de eerder genoemde booleanse expressies.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Hm, te laat; als toevoeging post ik het evengoed maar: ;)
F4T4L_3RR0R schreef op maandag 06 juli 2009 @ 16:35:
Even denken:

!== laat alles door.
=== laat niets door.

Wanneer BLA1, BLA2 of BLA3 in de string voorkomt, laat hij die niet door d.m.v. ===, echter wanneer BLA4 wel in de string voorkomt, moet === veranderd worden in !==.

Denk ik nu goed?
Denk het niet. Die operators laten niks door, maar retourneren een waarde, false of true. Wat er verder gebeurd hangt af van hoe die waardes gebruikt worden in (bijvoorbeeld) een if-statement.
Misschien helpt het als je de volgende functie hebt:
PHP:
1
2
3
function stricontains($haystack, $needle) {
    return stripos($haystack, $needle) !== false;
}

Je zou ook een functie kunnen hebben, die juist het omgekeerde doet:
PHP:
1
2
3
function stricontainsnot($haystack, $needle) {
    return stripos($haystack, $needle) === false;
}

Als je dan het volgende doet:
PHP:
1
2
3
4
5
6
7
8
$a="aap";
$b="a";
if (stricontains($a,$b)) {
     echo "string b zit in a\n";
}
if (!stricontainsnot($a,$b)) {
     echo "string b zit in a\n";
}

Dan zul je zien dat alle 2 de echo's uitgevoerd worden. Als je dan regel 2 verandert in $b="b";, dan zul je zien dat ze alle 2 niet uitgevoerd worden.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

F4T4L_3RR0R schreef op maandag 06 juli 2009 @ 16:35:
Even denken:

!== laat alles door.
=== laat niets door.

Wanneer BLA1, BLA2 of BLA3 in de string voorkomt, laat hij die niet door d.m.v. ===, echter wanneer BLA4 wel in de string voorkomt, moet === veranderd worden in !==.

Denk ik nu goed?
Je hebt die === of !== nodig bij elke aanroep van stripos die je doet. En als je die uitroeptekens echt in je string hebt (stripos($sms, "!BLA1")) dan moeten die dus op een logischere plaats dan dat. :)

'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!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
(stripos(iets) === false) => is waar als het er niet staat
(stripos(iets) === false) => is niet waar als het er wel staat
(stripos(iets) !== false) => is waar als het er wel in staat
(stripos(iets) !== false) => is niet waar als het er niet in staat

Bij "is niet waar als het er wel in staat" (BLA1, BLA2, BLA3) wordt de mailfunctie niet aangeroepen.
Bij "is waar als het er wel in staat" (BLA4 in combinatie met bovenstaande) wordt de mailfunctie wel aangeroepen.

Zit ik nu op het goede spoor?

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Vertaal dat eens naar een volledige conditie die je in je if-statement zou kunnen zetten? :)

'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!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
PHP:
1
if (stripos($sms, "BLA4") || (!stripos($sms, "BLA1") && !stripos($sms, "BLA2") && !stripos($sms, "BLA3")) !== false) {

Maar die laat BLA2 gewoon door. :?

Heb al zitten schuiven met de ( ), maar zonder resultaat.

[ Voor 19% gewijzigd door F4T4L_3RR0R op 06-07-2009 18:33 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Je moet niet een beetje gaan schuiven met haakjes. Je moet BEGRIJPEN waar je mee bezig bent. Overal hebben we het over de combinatie van stripos met ===false of !== false, maar ook weer in bovenstaand stukje code van je zie ik 4 stripos aanroepen met maar 1x een ===false.......

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Janoz schreef op maandag 06 juli 2009 @ 18:39:
Je moet niet een beetje gaan schuiven met haakjes. Je moet BEGRIJPEN waar je mee bezig bent. Overal hebben we het over de combinatie van stripos met ===false of !== false, maar ook weer in bovenstaand stukje code van je zie ik 4 stripos aanroepen met maar 1x een ===false.......
Ik dacht dat je met de ! voor de stripos de === output kon beïnvloeden.

Ik geef het op, heb dit topic diverse keren uitgeprint, tutorials uitgeprint, bijna een etmaal aan het Googlen geweest en het wilt maar niet werken...

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
F4T4L_3RR0R schreef op maandag 06 juli 2009 @ 18:44:
[...]

Ik dacht dat je met de ! voor de stripos de === output kon beïnvloeden.
Hoe kom je daar nou weer bij :? http://nl2.php.net/manual....operators.comparison.php

En verder vind ik het wel welletjes geweest nu. Het is niet de bedoeling dat we je handje gaan vasthouden (neem het topic nog eens door; er is meer dan voldoende info gegeven) en je bent al eerder gewezen op debuggen (doe dat eens; probeer stap voor stap je expressie uit te breiden). Tot slot is het gewoon basic kennis die wel zo handig is om machtig te zijn als je begint met programmeren. Als je verwacht dat we de oplossing op een zilveren presenteerblaadje aanreiken dan heb je het mis ;) Het is de bedoeling dat je er iets van leert ;)
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
Gewoon in 't wilde weg dingen gaan verzinnen, de docs er niet bij pakken en gewoon maar wat aanklooien tot 't werkt is natuurlijk niet programmeren.

[ Voor 31% gewijzigd door RobIII op 06-07-2009 19:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Ik dacht dat je met de ! voor de stripos de === output kon beïnvloeden.
Hoe kom je daar zo bij? Die vraag bedoel ik serieus. Ik ben namelijk erg benieuwd hoe je die afleiding gemaakt hebt. Vele post hebben het over !== en === en jij begint ineens over !stripos.

Goed, de str(i)pos functies van php zijn raar omdat ze een int en een boolean terug kunnen geven waardoor je even ietsje ingewikkelder is dan een gewoone booleaanse expressie, maar de oplossing van je probleem is hier nog net niet kant en klaar door meerdere mensen gegeven en het kwartje blijft gewoon niet vallen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1

Dit topic is gesloten.