| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

12-06-2010, 17:49
|
|
Jeremy
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 4
|
|
preg-match für einzelne wörter im Satz
Hallo, ich benutze dies Abfrage um bei Wörtern die nur einen Vokal haben vor diesen einen Slash zu setzen:
Zitat:
|
if (!mb_strstr($text,"/") AND preg_match_all("![аеиоуяюёэы]!u",$text,$dummy)==1) $text = preg_replace("!(.*)([аеиоуяюёэйы])!u","$1/$2",$text);
|
Das funktioniert gut bei einzelnen Wörtern, aber wenn ich nun einen Satz mit mehreren Wörtern habe, dann kommen ja insgesamt mehrere Vokale vor auch wenn es wörter mit nur einem gibt. Gibt es nun eine möglichkeit, das bei dem regulären ausdruck zu berücksichtigen, oder muss ich den satz erst in wörter zerstückeln?
Gruß
|

12-06-2010, 18:01
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Man kann das Vorkommen von word boundaries verlagen.
http://www.php.net/manual/en/regexp.....backslash.php
Allerdings ist die Definition, was eine Wortgrenze darstellt, von der im System eingestellten locale abhängig.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

12-06-2010, 19:00
|
|
Jeremy
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 4
|
|
danke für die Antwort, aber da blick ich gar nicht durch ?!
|

13-06-2010, 21:23
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Hier mal ein Lösungsansatz. Die beiden Zeichenklassen hab ich aus reiner Bequemlichkeit nur mit ASCII-Buchstaben getestet. Du darfst sie aber gerne mit den von dir benötigten Vokalen und Konsonanten füllen. Es müssen aber alle Buchstaben erfasst werden, sonst funktioniert das Ganze nicht. Groß- und Kleinbuchstaben müssen jeweils extra aufgelistet werden. Der Modifikator /i könnte hier Arbeit abnehmen, funktioniert aber leider nicht mit UTF-8 und auch nicht mit Codepages (das Locale-Geraffel).
PHP-Code:
$pcre = '/
(?(DEFINE)(?<vowel>[AEIOUaeiou]))
(?(DEFINE)(?<nonvowel>[BCDFGHJ-NP-TV-Zbcdfghj-np-tv-z]))
(?<=\P{L}|\A)(?=(?&nonvowel)*(?&vowel)(?&nonvowel)*(?:\P{L}|\z))
/xU';
preg_match_all($pcre, $kopna, $goli);
var_dump($goli);
$replaced = preg_replace($pcre, '-$0', $kopna);
var_dump($replaced);
Der RegEx ist prinzipiell UTF-8-tauglich. Du musst aber beim Auffüllen der Zeichenklassen darauf achten, dass dein Editor auch UTF-8 unterstützt. Wenn er das nicht tut, solltest du die Zeichen als \x{NNN}-Sequenzen eingeben.
Zitat:
Zitat von Jeremy
danke für die Antwort, aber da blick ich gar nicht durch ?!
|
"Word-boundaries sind locale-abhängig", heißt:
1.) "Wortgrenzen" suchen nach Buchstaben-Nichtbuchstaben-Kombinationen. Ein "Wort" in PCRE besteht immer aus Buchstaben. Ein Nicht-Wort-Bereich besteht aus allen anderen Zeichen (aber nicht aus Buchstaben).
2.) Was ein Buchstabe ist, wird in PHP's PCRE durch die setlocale()-Einstellung mitbestimmt. Die Zeichenklassen [A-Za-z] gehören zum ASCII-Bereich und sind immer Buchstaben. Deutsche Umlaute und Buchstaben mit Akzent stehen auf Zeichenpositionen oberhalb des ASCII-Bereichs. Abhängig von der verwendeten Codepage kann die gleiche Zeichenposition einen Buchstaben oder einen Nicht-Buchstaben darstellen.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (21-06-2010 um 10:29 Uhr)
|

19-06-2010, 17:18
|
|
Jeremy
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 4
|
|
hi,
vielen dank für den code,klappt schonmal ziemlich gut, dass er die richtigen wörter rausfindet. Allerdings packt er beim replace das Zeichen genau vor das wort und nicht vor den entsprechenden vokal im Netz, wie könnte man das noch ändern?
Gruß
|

21-06-2010, 10:26
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von Jeremy
hi,
vielen dank für den code,klappt schonmal ziemlich gut, dass er die richtigen wörter rausfindet. Allerdings packt er beim replace das Zeichen genau vor das wort und nicht vor den entsprechenden vokal im Netz, wie könnte man das noch ändern?
|
This behaviour is intentional. ... oder so ähnlich. Ich hatte deine Problemstellung so verstanden. Sonst hätte ich den Regex nicht in eine Assertion gesteckt.
So müsste das jetzt besser passen:
PHP-Code:
$pcre = '/
(?(DEFINE)(?<vowel>[AEIOUaeiou]))
(?(DEFINE)(?<nonvowels>[BCDFGHJ-NP-TV-Zbcdfghj-np-tv-z]*))
(?<=\P{L}|\A)(?&nonvowels)(?&vowel)(?&nonvowel)(?=\P{L}|\z)
/xU';
preg_match_all($pcre, $kopna, $goli);
var_dump($goli);
$replaced = preg_replace($pcre, '$1-$2$3', $kopna);
var_dump($replaced);
Man beachte die kleine (aber wichtige) Änderung im "nonvowel"-Bereich.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (21-06-2010 um 10:29 Uhr)
|

21-06-2010, 23:19
|
|
Jeremy
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 4
|
|
hallo, klappt leider auch nicht
Da ist noch ein kleiner rechtschreibfehler (nonvowel statt nonvowels), aber auch dann ersetzt er nun leider gar nichts mehr bei einem normalen wort,hat man allerdings nur einen Vokal ohne Konsonant wird der einfach komplett gelöscht..
|

25-06-2010, 20:29
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von Jeremy
hallo, klappt leider auch nicht
Da ist noch ein kleiner rechtschreibfehler (nonvowel statt nonvowels), aber auch dann ersetzt er nun leider gar nichts mehr bei einem normalen wort,hat man allerdings nur einen Vokal ohne Konsonant wird der einfach komplett gelöscht..
|
Huch, werd ich hier nach Stunden bezahlt?
Selbst ist der debuggende Scriptbastler, oder so ähnlich ...
Nimm dir einen "Heuhaufen"-String vor, in dem ein Wort vorkommt, dass vor und nach dem einzigen Konsonant mehrere Vokale hat. Dann wirfst du das preg_match() zum Fraß vor. Lass dir das Treffer-Array anzeigen. Die Index-Nummern der Einträge, die die "Vor"-Konsonanten, den Vokal und die "Danach"-Konsonanten enthalten, sollten die richtigen Nummern sein. Mit diesen ersetzt du die Nummern in meinem ursprünglichen Ersetzen-String.
Es dürfte sich mit hoher Wahrscheinlichkeit um 3, 4 und 5 handeln (also '$3-$4$5'). Ich hatte vergessen, dass die DEFINE-Subpattern auch mitgezählt werden müssen. Die sind noch etwas neu für mich.
Das mit den "nonvowels" hatte ich tatsächlich übersehen.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|