Hiho wie versprochen :)
Also zu deinem Problem:
ich suche alles nach "/Ich liebe [a-zA-Z ]*./" .
Das sollte alle Sätze finden, wo steht "Ich liebe Vorname Nachname." XYZ sei dann mal irgendeine Buchstabenfolge.Dann gebe es aber auch Sätze die so sein können:
"Ich liebe nicht Vorname"Oben genanntes Suchmuster könnte das ja nicht unterscheiden!
Wie mach ich es also das alles gefunden wird, was mit "Ich liebe" anfängt, dann nicht die Zeichenkette "nicht" enthält, und dann beliebige Buchstaben und Whitespaces hat.
Das ist relativ schwierig für den Computer zu verstehen, denn wie soll er denn wissen, wann dein Liebesschwur zuende ist ? Nach 10 Zeichen, nach 3 Wörtern oder wie lange geht das ? Hört es mit einem Punkt auf ? sonst würde er ja aus einem bekloppten text wie
"ich liebe dich wegen deines tollen haares deiner tollen figur und deinem knackarsch" das ganze "dich wegen deines tollen haares deiner tollen figur und deinem knackarsch" raussuchen, was er ja sicherlich nicht soll. Vorallem, wenn du sagst, da können auch 2 Wörter stehen oder mehr, wird es schwer, es zu filtern. Ok, wir gehen aber nun mal davon aus, dass du einfach einen "." hinter dem namen machst und dich auf leichte Sätze beschränken ( "Ich liebe klaus.", "ich liebe den tollen hecht hier.") Was besseres fällt mir im Moment nicht ein.
Ok, bevor ich aber die Lösiung schreib, nochwas zu deinen Lösungsansätzen:
Habe schon probiert mit ^ (negation)
Aber Konstrukte wie (^nicht) oder ^(nicht) oder [1] oder [^nicht] haben alle nichts gebracht!
Also das ^innerhalb einer noirmalen klammer oder vor der eckigen ist schwachsinn. Das klappt nur innerhalb von eckigen Klammern, also innerhalb einer Zeichenmenge. Da kommen wir auch shcon zum nächsten punkt. [^nicht] ist auch falsch, da er so alle zeichen außer n,i,c,h und t findet.
Ok, gehen wir mal schritt für schritt vor. Ein Regex für das einfache beispiel ohne die "nicht"-ausklammerung wäre:
"/(?:ich liebe|du liebst|er liebt|sie liebt|wir lieben|ihr liebt|sie lieben)[\x20]{1,}(.*)./Ui"
So findet er auch nicht das wort "liebe" sondern nur konjugierte verben. Wichtig ist hierbei der Modifierer U, sonst nimmt er den letzten Punkt. U heißt, er soll den ersten Fund nehmen.
Hier ein kleiner Code für den Anfang:
----------------------------------------
<?
$txt = 'ich liebe dich. ich liebe klaus. ich liebe den tollen hecht hier.';
preg_match_all("/(?:ich liebe|du liebst|er liebt|sie liebt|wir lieben|ihr liebt|sie lieben)[\x20]{1,}(.*)./Ui",$txt,$arr);
foreach($arr as $t1 => $t2)
foreach($t2 as $t3 => $t4)
print "<br>" . $t1 . " , " . $t2 . " ;" . $t3 . ": " . $t4;
?>
------------------------------------------
So, nun aber zum richtigen Problem:
Das "nicht" grenzt du so aus:
"/(?:ich liebe|du liebst|er liebt|sie liebt|wir lieben|ihr liebt|sie lieben)[\x20]{1,}(?!nicht)(.*)(?!nicht)./Ui",
Dazu hier noch das Beispiel
------------------------------------------
<?
$txt = 'ich liebe nicht dich. ich liebe klaus nicht. sie lieben den tollen hecht hier.';
preg_match_all("/(?:ich liebe|du liebst|er liebt|sie liebt|wir lieben|ihr liebt|sie lieben)[\x20]{1,}(?!nicht)(.*)(?!nicht)./Ui",$txt,$arr);
foreach($arr as $t1 => $t2)
foreach($t2 as $t3 => $t4)
print "<br>" . $t1 . " , " . $t2 . " ;" . $t3 . ": " . $t4;
?>
-------------------------------------------
Ich hoffe du kannst damit was anfa´ngen :)
Gruß
Hanno
nicht ↩︎