既然你不想忽略屬於僅數點,但還可以使用縮寫,姓名等,只是忘記了一會兒的數字。
我已經設置了一個包含一些Lorem Ipsum的小提琴,在中間我添加了你的例句,後面跟着一些更多的縮寫和名字。
<?php
$var = <<<EOT
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam tortor velit, facilisis ac malesuada vel, tristique sit amet purus.
Donec magna turpis, iaculis vitae nisl et, porttitor tincidunt augue. Fusce odio tortor, laoreet ut turpis eget, lobortis ultrices lorem.
One team anticipates they will break the previous record of 92.49% efficiency, which was set in 1991. B.T.W.: abbreviations like U.S. and names like I.M. Theman should also be ignored.
Duis lobortis lacus ligula, a lobortis ipsum lacinia in. Suspendisse potenti. Donec mattis volutpat nisi, non cursus est. Nam pellentesque congue lectus, in auctor erat viverra sit amet.
Mauris pellentesque magna dolor, in euismod neque mattis eu. Etiam in massa eget eros consectetur iaculis eu in tortor.
Mauris luctus, nulla ac blandit molestie, augue dui iaculis orci, eu suscipit ipsum mauris a enim. Curabitur vel mauris lorem. Maecenas et metus cursus, posuere nisi vitae, auctor turpi.
EOT;
$var = preg_replace('/[^\.]{2,}\.\s/', '$0[[SPLIT]]', $var);
$lines = explode('[[SPLIT]]', $var);
print_r($lines);
如果你看一下文本可以彌補以下邏輯:
- 在句點結束,應始終遵循由空格:空格或一個換行符
- 縮寫後面還跟着空格。在很多情況下,儘管它只有一個字符。一個句子永遠不會以單個字符結尾(我認爲),所以讓我們說,在點之前,必須有多於一個字符不是空格或點。
這個邏輯讓下面的正則表達式:
/[^\.]{2,}\.\s/
正如你可以在這裏看到,該作品:http://ideone.com/MkyEcL
請注意以下事項:
- 您可以用preg_split()來做到這一點,但正如你在我的例子中看到的那樣,我試着保持文本的完整性。所以我保留點,空格和換行符。我不知道如何用preg_split做到這一點,所以我已經將preg_replace()和explode()結合起來了。
另請注意,我可以考慮我認爲無法捕捉的病例。例如以下語句:
「我是Theman先生,我愛StackOverflow。」
在這種情況下,縮寫有多個字符,後面跟着空格,甚至後面的字符也是大寫字母。我認爲在正則表達式中捕獲這種情況根本不可能,因爲您只需知道它是否是縮寫。
有趣的案例。請注意,有更多的案例可以包含一個點,如abreviations和名稱。如果這些句子被解析爲句子,您是否希望將其考慮在內或者不是問題? – vrijdenker 2014-10-31 18:26:27
請在字符串前後顯示我們(編輯問題,請勿將它置於註釋中)。 – 2014-10-31 18:28:31
@vrijdenker這是一個很好的觀點,特別是縮寫(例如美國)提出了同樣的問題。我將編輯該問題以適用於更一般的情況。 – CodeMoose 2014-10-31 18:32:55