2009-07-16 8 views
7

Wenn ich eine Beschreibung wie:Hat jemand ein PHP-Code-Schnipsel, um den ersten "Satz" in einer Zeichenfolge zu erfassen?

„. Wir bevorzugen es Fragen, die beantwortet werden können, nicht nur diskutiert Details Geben Schreiben Sie klar und einfach.“

und alles, was ich will, ist "Wir bevorzugen Fragen, die beantwortet werden können, nicht nur diskutiert."

Ich würde nach einem regulären Ausdruck suchen, wie "[.! \?]", Die strpos bestimmen und dann einen Teilstring von der Hauptsaite machen, aber ich stelle mir vor, dass es eine gemeinsame Sache ist, also jemanden zu hoffen hat einen Schnipsel herumliegen.

Danke!

Antwort

16

Ein etwas teurer Ausdruck wird jedoch sein, anpassungsfähiger, wenn Sie mehrere Arten von Interpunktion als Satz Terminatoren auswählen möchten.

$sentence = preg_replace('/([^?!.]*.).*/', '\\1', $string); 

Suche Abschlusszeichen gefolgt von einem Leerzeichen

$sentence = preg_replace('/(.*?[?!.](?=\s|$)).*/', '\\1', $string); 
+0

Danke dafür. Ich nehme an, ich kann die Kosten akzeptieren, da sie zwischengespeichert werden. – FilmJ

+0

Eigentlich gerade realisiert, das fehlte ein Stück. Weil es alles bis zum Ende packt, lässt es den eigentlichen Interpunktionssatz fallen. EIN "." Am Ende der Suche scheint sich der Ausdruck innerhalb des Parens aufzulösen. preg_replace ('/([^?!.]*.).*/', '\\ 1', $ str); – FilmJ

+0

Sie müssen den Code gegriffen haben, bevor ich geändert habe :) Wenn Sie wieder schauen, ist das, was ich gepostet habe. –

6
<?php 
$text = "We prefer questions that can be answered, not just discussed. Provide details. Write clearly and simply."; 
$array = explode('.',$text); 
$text = $array[0]; 
?> 
+0

+1 auf diese Antwort. Es sollte jedoch angemerkt werden, dass dies bei allen. (D. H. Dem Periodenzeichen) explodiert. Also, wenn der Satz Abkürzungen wie "d. H." Enthält oder z.B."Sie werden in Probleme geraten. Abgesehen davon ist es die einfachste Option. – mdec

+0

Nicht alle Sätze enden jedoch mit "." S. Ich brauche etwas, das mit "!" und "?" außerdem bin ich mir ziemlich sicher, also müsste es regexp verwenden, denke ich. – FilmJ

+0

Sie können Elemente von $ array weiter durch '!', '?' Usw. trennen. – Jason

0
reset(explode('.', $s, 2)); 
0
current(explode(".",$input)); 
0

ich wahrscheinlich eine der Scharen von Teilzeichenfolge/string-split-Funktionen in PHP (einige erwähnt hier bereits) verwenden würde. Suchen Sie aber auch nach "." ODER ". \ N" (und möglicherweise ". \ N \ r") statt nur nach ".". Nur für den Fall, aus welchem ​​Grund auch immer, enthält der Satz einen Punkt, auf den kein Leerzeichen folgt. Ich denke, es wird die Wahrscheinlichkeit erhöhen, dass Sie echte Ergebnisse erzielen.

Beispiel, Suche nach nur "." auf:

"I like stackoverflow.com." 

erhalten Sie:

"I like stackoverflow." 

Wenn wirklich, ich bin sicher, würden Sie bevorzugen:

"I like stackoverflow.com." 

Und sobald Sie die einfache Suche haben, werden Sie wahrscheinlich ein oder zwei Gelegenheiten, wo es etwas verpassen könnte. Tune wie du damit rennst!

+0

Die meisten Zeichenfolgen haben wahrscheinlich keine Zeilenumbrüche in ihnen. –

+0

Ich denke jedoch, dass viele Strings (und einige in meinem Projekt) URLs haben ... so wäre es gut, die Lösung dafür herauszufinden, obwohl die oben akzeptierte Antwort für jetzt gut ist. – FilmJ

3

Meine vorherige Regex schien im Tester zu funktionieren, aber nicht in PHP. Ich habe diese Antwort bearbeitet, um vollen, funktionierenden PHP-Code und eine verbesserte Regex zu liefern.

$string = 'A simple test!'; 
var_dump(get_first_sentence($string)); 

$string = 'A simple test without a character to end the sentence'; 
var_dump(get_first_sentence($string)); 

$string = '... But what about me?'; 
var_dump(get_first_sentence($string)); 

$string = 'We at StackOverflow.com prefer prices below US$ 7.50. Really, we do.'; 
var_dump(get_first_sentence($string)); 

$string = 'This will probably break after this pause .... or won\'t it?'; 
var_dump(get_first_sentence($string)); 

function get_first_sentence($string) { 
    $array = preg_split('/(^.*\w+.*[\.\?!][\s])/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); 
    // You might want to count() but I chose not to, just add 
    return trim($array[0] . $array[1]); 
} 
+0

Dies scheint nicht zu funktionieren. Hast du es geändert, seit du es gepostet hast? – FilmJ

+0

Es tut uns leid, schrieb es um und es arbeitet jetzt PHP-Code. – dyve

+0

so funktionierte das jetzt nicht nur, aber am Ende behandelte es tatsächlich mein wirkliches Problem, während Ians nicht ... (obwohl es zuerst tat). Wie ich oben bemerkt habe, liegt das vielleicht daran, dass die Ergebnisse Unicode-Strings sind ... nicht sicher, aber Denkanstoß. Danke für die Funktion - ich definiere. benutze es immer wieder. – FilmJ

0

Dies ist ein wirklich hartes Problem. Ich empfehle, in ein NLP-Paket zu schauen, wenn Sie robuste Ergebnisse benötigen. Ein Tokenizer kann Satzbeendigungszeichen identifizieren (entweder "?", ".", ";" Usw.), abhängig von Ihrer beabsichtigten Verwendung, und Sie können sich darauf trennen.

2
<?php 

    $content = "My name is Younas. I live on the pakistan. My email is **[email protected]** and skype name is "**fromyounas**". I loved to work in **IOS development** and website development . "; 

    $dot = "."; 

    //find first dot position  

    $position = stripos ($content, $dot); 

    //if there's a dot in our soruce text do 

    if($position) { 

     //prepare offset 

     $offset = $position + 1; 

     //find second dot using offset 

     $position2 = stripos ($content, $dot, $offset); 

     $result = substr($content, 0, $position2); 

     //add a dot 

     echo $result . '.'; 

    } 

?> 

Ausgang ist:

Mein Name Younas ist. Ich lebe auf dem Pakistan.

Verwandte Themen