Hallo Andreas,
So grob habe ich es verstanden, hatte das genau anders
herum gedacht, aber so rum ist es auch erheblich einfacher!
Vor allem sinnvoller *g*
for ($i=0,$word_start=0;$i<strlen($input_string);$i++) {
if(preg_match("/[^a-zA-Z0-9äöüÄÖÜ_/-]/",substr($input_string,$i,1))) {
if($word_end) {
$word_array[] = substr($input_string,$word_start);
}
$word_start = $i+1;
unset($word_end);
}
else {
$word_end = $i;
}
}Was sagst Du dazu?
Da ist ein Fehler drin. Und der RegEx ist auch unnoetig. Ich
wuerde an deiner Stelle es etwa so machen:
define('MIN_WORD_LEN',2);
$Stopwords = Array(
'wort1' => 1,
'wort2' => 1
);
function is_wchar($c) {
if(ord($c) >= 48 && ord($c) <= 122) return true;
switch($c) {
case 'ä':
case 'Ä':
case 'ö':
case 'Ö':
case 'ü':
case 'Ü':
case 'ß':
case '_':
case '/':
case '-':
return true;
}
return false;
}
$words = Array();
strlen() ist nicht beliebig schnell, im Gegenteil :)
$len = strlen($input);
while($pos<$len) {
# lets find the beginning of the next word
for($begin=$pos;!is_wchar($input{$begin});++$begin);
# lets find the end of the next word
for($end=$begin;is_wchar($input{$end});++$end);
$pos = $end + 1;
$wrd = substr($input,$begin,$len-$end);
if($end-$begin < MIN_WORD_LEN) continue;
if($Stopwords[strtolower($wrd)]) continue;
$words[] = $wrd;
}
Aber wie soll man das sonst lösen?
Na, genau so, wie es in C geschrieben wird? :)
Und auch die Verwendung
von substr(), leider kenne ich keine andere Methode einen
String buchstabenweise zu durchsuchen.
Da hilft das Manual ab.
Das ist aber blöd, nicht jeder fügt manuell Zeilenumrüche
in laufenden Text ein, oder?
Nein. Aber es ist Absicht. Ich moechte Postings wie
q text text
q text text
blahr
q text text
q text text
verhindern. Also so Postings, die einfach mitten drin was
schreiben, ohne ueberfluessige Quotes zu loeschen.
Gruesse,
CK