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

16-01-2009, 21:10
|
|
HenryH
Newbie
|
|
Registriert seit: Jan 2003
Beiträge: 56
|
|
preg_split() Text nach Zeichen splitten, aber nicht bei bestimmten Wörtern
Hi,
ich möchte mit preg_split() einen String aufsplitten. Trenner sollen die Zeichen .,! sowie Zeilenumbruch sein.
Mit
PHP-Code:
$split = preg_split("/[\.,!] |\n/", $text, -1, PREG_SPLIT_NO_EMPTY );
klappt das so weit auch wunderbar.
Jetzt kommen in manchen Texten aber Abkürzungen vor, die die vorgenannten Zeichen (z.B. einen Punkt) enthalten, bei denen nicht getrennt werden soll.
Beispiel:
PHP-Code:
$text = "Lederjacke! Bordeaux, imprägniert, inkl. Innenfutter mit Reißverschluss, 1 Jahr alt";
$split = preg_split("/[\.,!] |\n/", $text, -1, PREG_SPLIT_NO_EMPTY );
foreach($split as $splittext)
{
$x .= $br . $splittext;
$br = "<br />";
}
echo $x;
ergibt:
Lederjacke
Bordeaux
imprägniert
inkl
Innenfutter mit Reißverschluss
Sonderpreis
So hätte ich es gerne:
Lederjacke
Bordeaux
imprägniert
inkl. Innenfutter mit Reißverschluss
Sonderpreis
Wie muss ich nun den Ausdruck gestalten, dass die Worte "inkl." und "incl." nicht zum Trennen des Textes führen?
Gruß
Henry
|

16-01-2009, 21:28
|
|
jmc
PHP Junior
|
|
Registriert seit: Mar 2006
Beiträge: 868
|
|
Stichwort negativer lookahead, bzw. lookbehind.
|

16-01-2009, 21:44
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 644
|
|
Re: preg_split() Text nach Zeichen splitten, aber nicht bei bestimmten Wörtern
Zitat:
Original geschrieben von HenryH
Hi,
ich möchte mit preg_split() einen String aufsplitten. (...) Beispiel:
PHP-Code:
$text = "Lederjacke! Bordeaux, imprägniert, inkl. Innenfutter mit Reißverschluss, 1 Jahr alt";
$split = preg_split("/[\.,!] |\n/", $text, -1, PREG_SPLIT_NO_EMPTY );
foreach($split as $splittext)
{
$x .= $br . $splittext;
$br = "<br />";
}
echo $x;
|
Warum mit preg_split()? Wenn du einfach die "Trennzeichen" ersetzen willst, tuts doch auch preg_replace():
PHP-Code:
$text = 'Punkt. Punkt. Test incl. Lederjacke! Bordeaux, imprägniert, '.
'inkl. Innenfutter mit Reißverschluss, 1 Jahr alt';
$x = preg_replace('/(?:[,!]|(?<!in[ck]l)\.)\s+/', '<br />', $text);
Zitat:
|
Wie muss ich nun den Ausdruck gestalten, dass die Worte "inkl." und "incl." nicht zum Trennen des Textes führen?
|
Code:
'/ # finde
( # entweder
[,!] # Komma, Ausrufezeichen
| # ODER
(?<!in[ck]l)\. # Punkt, vor dem KEIN "inkl"|"incl" steht
) #
\s+ # UND dazu ein bis mehrere Leerzeichen (Whitespace)
/x'
(Fehlende Backslashes bitte wie immer aus der Zitat-Ansicht holen ...)
Du solltest aber bedenken, dass dieser Trick nur bei gleichlangen Buchstabenfolgen vor dem Punkt funktioniert. Die negative Lookbehind-Assertion "(?<! ... )" funktioniert nämlich nur in Ausnahmefällen mit variablen Längen -- "inkl" und "incl" sind zufälligerweise gleich lang, da stellt das kein Problem dar.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

16-01-2009, 22:01
|
|
HenryH
Newbie
|
|
Registriert seit: Jan 2003
Beiträge: 56
|
|
Hi,
vielen Dank schon mal für die Tipps. Das scheint in die richtige Richtung zu gehen, funktioniert aber nach dem Beispiel von fireweasel noch nicht so ganz.
Ergebnis mit preg_split():
Zitat:
Lederjacke! Bordeaux, imprägniert, inkl. Innenfutter mit Reißve
chl
, Sonderpre
|
preg_split() verwende ich deshalb, weil ich die Zeichen nicht ersetzen, sondern in ein Array schreiben will. Ich habe das, um es nicht zu komplizieren, gegen <br /> ersetzt, u.a. damit man den Erfolg auch gleich betrachten kann. So habe ich wohl ein Mißverständnis geschaffen.
Ich habe damit nun noch ein wenig weiter rumexperimentiert , komme aber nicht wirklich weiter.
@fireweasel
hast Du da noch eine Idee, was ich tun muß?
Gruß
Henry
|

17-01-2009, 21:12
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 644
|
|
Zitat:
Original geschrieben von HenryH
...
preg_split() verwende ich deshalb, weil ich die Zeichen nicht ersetzen, sondern in ein Array schreiben will. Ich habe das, um es nicht zu komplizieren, gegen <br /> ersetzt, u.a. damit man den Erfolg auch gleich betrachten kann. So habe ich wohl ein Mißverständnis geschaffen.
|
Ja, so könnte man das wohl ausdrücken. ;-)
Zitat:
|
Ich habe damit nun noch ein wenig weiter rumexperimentiert , komme aber nicht wirklich weiter.
|
Hmmm, ich finde keinen Fehler ...
Ich hab exakt den gleichen PCRE mit preg_split() eingesetzt, also:
PHP-Code:
$teile = preg_split('/(?:[,!]|(?<!in[ck]l)\.)\s+/', $text);
... und bekomme damit auch das gleiche Ergebnis, nur eben als PHP-Array ohne die <br />-Elemente.
Wichtig:
1. Keine weiteren Parameter für preg_split().
2. Hole dir den PCRE aus der Zitat-Ansicht, sonst fällt der Backslash unter den Tisch, der hier sehr wichtig ist, er macht nämlich aus dem Zeichen mit Spezialbedeutung "."[1] einen gewönlichen Punkt.
--
[1] "." Bedeutet in regulären Ausdrücken üblicherweise: (Fast) jedes beliebige Zeichen.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

19-09-2010, 21:34
|
|
DeSena
Registrierter Benutzer
|
|
Registriert seit: Oct 2006
Ort: Frankfurt
Beiträge: 9
|
|
Trennungszeichen mit preg_replace behalten
Hi Fireweasel,
Dein Skript
PHP-Code:
$text = 'Punkt. Punkt. Test incl. Lederjacke! Bordeaux, imprägniert, '.
'inkl. Innenfutter mit Reißverschluss, 1 Jahr alt';
$x = preg_replace('/(?:[,!]|(?<!in[ck]l)\.)\s+/', '<br />', $text);
funkioniert wunderbar.
Die Frage wäre, wie kann man die Trennungszeichen dabei behalten, sodass
PHP-Code:
für ":" => ':<br />', $text);
für "?" => '?<br />', $text);
für "." => '.<br />', $text);
usw.
Und, um alles schwieriger zu machen, hier
PHP-Code:
$x = preg_replace('/(?:[,!]|(?<!in[ck]l)\.)\s+/', '<br />', $text);
sollten auch andere Abkürzung enthalten sein:
u.a., z.B., usw., Nr., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.
Mir fällt gerade WENN, IF, ELSE... mal sehen wie das aussehen könnte
Geändert von DeSena (20-09-2010 um 01:35 Uhr)
|

19-09-2010, 21:36
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.455
|
|
Zitat:
Zitat von DeSena
Die Frage wäre, wie kann man die Trennungszeichen dabei behalten
|
Stichwort: Back-References
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|
|
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
|