php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.03.2010, 14:57  
Neuer Benutzer
 
Registriert seit: 12.03.2010
Beiträge: 4
PHP-Kenntnisse:
Anfänger
AnnaQ befindet sich auf einem aufstrebenden Ast
Standard Problem mit preg_match_all() / RegEX / newline

Hallo zusammen,

Ich möchte ein Skript schrieben, welches Transskripte verarbeitet. Zu diesem Zweck muss ich die Transskripte aber in ein Machinenlesbares Format bringen. Der erste (und für mich schwierigste) Schritt ist die Aufteilung der "Lines".
Als Beispiel habe ich z.B. ein solches Transskript:

Code:
TOM: Guten Tag!
PETER: Hallo.
SARAH: Wie geht es euch?
Das Skript, welches ich geschrieben habe, funktioniert auch soweit. Wenn das Transskript jedoch so aussieht (also ohne \n)

Code:
TOM: Guten Tag! PETER: Hallo...
--> Dann wird jeweils nur die Aussage von TOM als neue Linie erkannt!

Oder so:

Code:
TOM: Guten Tag, dies ist
ein langer
Satz
--> Dann wird nur die erste Linie als Aussage von Tom erfasst, der Rest wird ignoriert...

Ich verwende dabei die preg_match_all() Funktion wie folgt:

PHP-Code:
preg_match_all('/([A-Z|[|(].+): (.+)/i'$sample$lines); 
Wiegesagt matched die Funktion nur, wenn der Name ("TOM:") am Anfang einer Linie steht und der zweite Teil greift nur bis dahin, wo eine newline folgt.

Weiss jemand, wie ich die Funktion entsprechend verbessern könnte?

Vielen Dank im Vorraus!
AnnaQ ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 12.03.2010, 17:17  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.071
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

modifier s
__________________
HalloPHP
Asipak ist offline   Mit Zitat antworten
Alt 12.03.2010, 19:56  
Neuer Benutzer
 
Registriert seit: 12.03.2010
Beiträge: 4
PHP-Kenntnisse:
Anfänger
AnnaQ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Asipak Beitrag anzeigen
Danke für den Hinweis, auf diesen modifier bin ich auch schon gestossen, aber leider hat es auch so nicht geklappt:

PHP-Code:
$script "
PETER: Dies ist ein Test.
HANS: Dies auch,
aber dieser Test geht über 2 Linien.
FOO: Bar!"
;

preg_match_all('/([A-Z|[|(]+): (.+)/si'$script$lines); 
Ergibt bei $lines:
Zitat:
PETER: Dies ist ein Test. HANS: Dies auch, aber dieser Test geht über 2 Linien. FOO: Bar!
Wenn ich das "s" weglasse sieht es so aus:
Zitat:
PETER: Dies ist ein Test.
HANS: Dies auch,
FOO: Bar!
AnnaQ ist offline   Mit Zitat antworten
Alt 13.03.2010, 08:10  
Benutzer
 
Registriert seit: 28.06.2009
Beiträge: 96
PHP-Kenntnisse:
Fortgeschritten
eisenhans befindet sich auf einem aufstrebenden Ast
Standard Greedy

Der Ausdruck .+ ist "gierig" (greedy) und nimmt sich alles was, er findet.

Nimm statt dessen .+?, um nur das Ergebnis bis zum nächsten Großbuchstaben mit Doppelpunkt zu bekommen.
eisenhans ist offline   Mit Zitat antworten
Alt 13.03.2010, 11:10  
Neuer Benutzer
 
Registriert seit: 12.03.2010
Beiträge: 4
PHP-Kenntnisse:
Anfänger
AnnaQ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von eisenhans Beitrag anzeigen
Der Ausdruck .+ ist "gierig" (greedy) und nimmt sich alles was, er findet.

Nimm statt dessen .+?, um nur das Ergebnis bis zum nächsten Großbuchstaben mit Doppelpunkt zu bekommen.
Geht leider auch nicht:

Zitat:
PETER: Dies ist ein Test.
HANS: Dies auch,
aber dieser Test geht über 2 Linien.
FOO: Bar!
=>
PHP-Code:
/([A-Z|[|(].+): (.+?)/
Ergibt:

Zitat:
match

match[0]

match[0][0]
PETER:·D
match[0][1]
HANS:·D
match[0][2]
FOO:·B

match[1]

match[1][0]
PETER
match[1][1]
HANS
match[1][2]
FOO

match[2]

match[2][0]
D
match[2][1]
D
match[2][2]
B
Und mit s, wie oben vorgeschlagen:

PHP-Code:
/([A-Z|[|(].+): (.+?)/si 
Zitat:
match

match[0]

match[0][0]
PETER:·Dies·ist·ein·Test. CR LF
HANS:·Dies·auch, CR LF
aber·dieser·Test·geht·über·2·Linien. CR LF
FOO:·B

match[1]

match[1][0]
PETER:·Dies·ist·ein·Test. CR LF
HANS:·Dies·auch, CR LF
aber·dieser·Test·geht·über·2·Linien. CR LF
FOO

match[2]

match[2][0]
B
Habe das übrigens mit Regular Expression Testing - for php's preg functions ausprobiert.

Kennt niemand die Lösung?
AnnaQ ist offline   Mit Zitat antworten
Alt 13.03.2010, 13:22  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.579
PHP-Kenntnisse:
Fortgeschritten
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Hat das zufällig was mit Sprachwissenschaft zu tun?

PHP-Code:
<?php

function getLines($s)
{
    
$lines = array();

    
// Alle Zeilenumbrüche zu \n machen
    
$s str_replace(array("\r\n""\r"), array("\n""\n"), $s);

    
preg_match_all('~
        (\p{Lu}{2,}):         # siehe: http://www.php.net/manual/en/regexp.reference.unicode.php
        (.*?)
        (?=(?:\p{Lu}{2,}:)|$) # right assertion
        ~sux'
$s$matches);

    
$cnt count($matches[0]);

    for (
$i 0$i $cnt$i++) {
        
$lines[] = array('speaker' => $matches[1][$i],
                         
'text'    => trim($matches[2][$i]));
    }

    return 
$lines;
}

$test = <<<EOT
PETER: Dies ist ein Test.
HANS: Dies auch,
aber dieser Test geht über 2 Linien.
FOO: Bar! PETER: Blabliblub. TEST. UWE: Hier komme ich.
EOT;

$lines getLines($test);



header('Content-Type: text/html; charset=utf-8');

echo 
'<pre>';
foreach (
$lines as $line) {
    echo 
'<em>' $line['speaker'] . '</em>&nbsp;';
    echo 
'"' $line['text'] . '"' "\n\n";
}
echo 
'</pre>';

Geändert von mermshaus (13.03.2010 um 13:28 Uhr). Grund: Kleine Verbesserung
mermshaus ist offline   Mit Zitat antworten
Alt 13.03.2010, 15:16  
Neuer Benutzer
 
Registriert seit: 12.03.2010
Beiträge: 4
PHP-Kenntnisse:
Anfänger
AnnaQ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Hat das zufällig was mit Sprachwissenschaft zu tun?
Nein, es geht um ein kleines privates Projekt von mir mit Transskripten von TV-Serien.

Vielen Dank für deinen Code! Wäre es noch irgendwie möglich eine Exception für Angaben in [] und () einzubauen? Szenerienwechsel sind meistens so angegeben! Ansonsten ist es genau wonach ich gesucht habe, wobei es mich trotzdem noch reizen würde meinen bestehenden Code so zu verbessern dass er funktioniert... Du wüsstest nicht zufällig wie man diesen Code verbessern könnte:

PHP-Code:
preg_match_all('/([A-Z|[|(]+): (.+)/i'$script$lines); 
Damit er wie Deiner funktioniert?
AnnaQ ist offline   Mit Zitat antworten
Alt 13.03.2010, 16:18  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.579
PHP-Kenntnisse:
Fortgeschritten
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von AnnaQ Beitrag anzeigen
Vielen Dank für deinen Code! Wäre es noch irgendwie möglich eine Exception für Angaben in [] und () einzubauen?
Ja, wäre es sicherlich, aber das würde den Ausdruck nicht gerade vereinfachen. Es dürfte übersichtlichere Methoden geben, entsprechenden Text zu parsen. Poste im Zweifel mal eine Beispieleingabe, die alle Eventualitäten abdeckt.

Zitat:
Ansonsten ist es genau wonach ich gesucht habe, wobei es mich trotzdem noch reizen würde meinen bestehenden Code so zu verbessern dass er funktioniert... Du wüsstest nicht zufällig wie man diesen Code verbessern könnte:
Ich versuch's mal: Der Pipe-Character ("|") in deinem Beispiel bedeutet nicht "ODER", sondern steht an der Stelle einfach für den Pipe-Character. Zeichen innerhalb einer Charakterklasse ([...]) sind immer ODER-verknüpft. Zudem ist dein Pattern auf der rechten Seite nicht "verankert", das heißt, es existiert keine Regel, die anzeigt, wann das Match für den Inhalt der Zeile endet. Das muss hier aber (meiner Meinung nach) angezeigt werden, da sonst ein "greedy" Ausdruck (.*) alles bis zum Stringende matcht (möglichst viel) und ein "ungreedy" Ausdruck (.*?) gar nichts (möglichst wenig).
mermshaus ist offline   Mit Zitat antworten
Alt 16.03.2010, 00:09  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.256
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
PHP-Code:
    for ($i 0$i $cnt$i++) {
        
$lines[] = array('speaker' => $matches[1][$i],
                         
'text'    => trim($matches[2][$i]));
    } 
PREG_SET_ORDER macht das quasi frei Haus.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] RegEx Suchmuster Problem henny23 PHP Tipps 2009 3 26.10.2009 16:39
Umlaut Problem nokieone PHP Tipps 2009 7 16.10.2009 19:30
regex, [^abc] problem FirePanther PHP Tipps 2009 15 30.08.2009 13:32
Regex Problem knea PHP Tipps 2009 5 08.05.2009 13:03
Array sortieren mit regex Lupi PHP Tipps 2008 3 21.07.2008 15:17
Problem mit regex BLiNK PHP Tipps 2006 19 25.03.2006 13:32
Problem mit zu langen String -> regex PHP Tipps 2006 1 25.01.2006 17:38
[Erledigt] Problem mit einem Regex PHP-Fortgeschrittene 4 23.01.2006 09:34
[Erledigt] Regex Problem. PHP Tipps 2007 14 07.11.2005 15:24
komplexeres Regex Problem Schaelle PHP Tipps 2005-2 14 29.08.2005 20:21
Problem mit RegEx freq.9 PHP Tipps 2005-2 3 29.08.2005 13:32
Regex Problem PHP Tipps 2005-2 8 14.08.2005 18:40
Problem mit regex PHP Tipps 2004 1 09.09.2004 10:00
[Erledigt] regex problem PHP Tipps 2004 9 04.09.2004 16:46
Problem mit eine REGEX! PHP-Fortgeschrittene 7 04.06.2004 17:04

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
regex newline, regex new line, regex doppelpunkt, preg_match_all, preg_match_all newline, php newline, regexp newline, preg_match linefeed, regular expression new line, newline regex, preg_match doppelpunkt, preg_match_all von bis, php preg_match newline, regular expression newline, regexp linefeed, regex linefeed, regexp new line, php regex new line, newline php, regex newline php

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum