2015-01-05 4 views
0

다음 스크립트를 사용하여 큰 문자열을 문장으로 분할했습니다. 그러나 나는 그것도 날짜에 휴식 시간에 점점 문제가 있습니다.날짜에 문자열 깨기

원래 작업 코드 :

$re = '/# Split sentences on whitespace between them. 
(?<=    # Begin positive lookbehind. 
    [.!?:]    # Either an end of sentence punct, 
| [.!?:][\'"] 
| [\r\t\n]    # or end of sentence punct and quote. 
)     # End positive lookbehind. 
(?<!    # Begin negative lookbehind. 
    Mr\.    # Skip either "Mr." 
| Mrs\.    # or "Mrs.",  
| Ms\.    # or "Ms.", 
| Jr\.    # or "Jr.", 
| Dr\.    # or "Dr.", 
| Prof\.   # or "Prof.", 
| U\.S\.A\. 
| Sr\.    # or "Sr.", 
| T\.V\.A\.   # or "T.V.A.", 
| a\.m\.   # or "a.m.", 
| p\.m\.   # or "p.m.", 
| •\. 
| :\. 
| •\. 

        # or... (you get the idea). 
)     # End negative lookbehind. 
\s+     # Split on whitespace between sentences. 

/ix'; 

$sentences = preg_split($re, $block_o_text, -1, PREG_SPLIT_NO_EMPTY); 
for ($i = 0; $i < count($sentences); ++$i) { 

내가 추가 한 [0-9]/[0-9]/[0-9],하지만 원하는 효과를 낳게 될 것 같지 않습니다. 내가 뭘 놓치고 있니? 여기 내 업데이트 된 코드는 다음과 같습니다.

$re = '/# Split sentences on whitespace between them. 
(?<=    # Begin positive lookbehind. 
    [.!?:]    # Either an end of sentence punct, 
| [.!?:][\'"] 
| [\r\t\n]   # or end of sentence punct and quote. 
| [0-9]/[0-9]/[0-9] # or on a date 
)     # End positive lookbehind. 
(?<!    # Begin negative lookbehind. 
    Mr\.    # Skip either "Mr." 
| Mrs\.    # or "Mrs.",  
| Ms\.    # or "Ms.", 
| Jr\.    # or "Jr.", 
| Dr\.    # or "Dr.", 
| Prof\.   # or "Prof.", 
| U\.S\.A\. 
| Sr\.    # or "Sr.", 
| T\.V\.A\.   # or "T.V.A.", 
| a\.m\.   # or "a.m.", 
| p\.m\.   # or "p.m.", 
| •\. 
| :\. 
| •\. 

        # or... (you get the idea). 
)     # End negative lookbehind. 
\s+     # Split on whitespace between sentences. 

/ix'; 
+0

매우 복잡한 정규 표현식을 작성하는 것보다 파서를 만드는 것이 더 나을 것입니다. –

답변

1

날짜는 특히 한 해에만 한 자리 숫자가 아닙니다. 그 점을 고려해야합니다. 또한 정규 표현식 분리 문자이므로 /을 이스케이프 처리해야합니다.

[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2,4}