2015-01-13 2 views
1

У меня есть следующий скрипт для разделения предложений. Есть несколько фраз, которые я хотел бы рассматривать как конец предложения в дополнение к пунктуации. Это отлично работает, если это один символ, но не тогда, когда есть место.preg_split на основе предложения

Это код, у меня есть, что работает:

$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. 
| HYPERLINK 
| .org 
| .gov 
| .aspx 
| .com 
| Date 
| Dear 
)     # 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\. 
| U\.S\. 
| Sr\.    # or "Sr.", 
| T\.V\.A\.   # or "T.V.A.", 
| a\.m\.   # or "a.m.", 
| p\.m\.   # or "p.m.", 
| a€¢\. 
| :\. 

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

/ix'; 

Это пример фраза, которую я попытался добавить: «Общий валовой доход»

Я попытался форматирование его в этих отношениях, но ни один из них не работает:

$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. 
| HYPERLINK 
| .org 
| .gov 
| .aspx 
| .com 
| Date 
| Dear 
| "Total Gross Income" 
| Total[ X]Gross[ X]Income 
| Total" "Gross" "Income 
) 

в этом, например, если у меня есть следующий код:

$block_o_text = "You could receive the wrong amount. If you receive more benefits than you should, you must pay them back. When will we review your case? An eligibility review form will be sent before your benefits stop. Total Gross Income Total ResourcesMedical ProgramsHousehold."; 

$sentences = preg_split($re, $block_o_text, -1, PREG_SPLIT_NO_EMPTY); 

for ($i = 0; $i < count($sentences); ++$i) { 
    echo $i . " - " . $sentance . "<BR>"; 
} 

Результаты я получаю:

77 - You could receive the wrong amount. 
78 - If you receive more benefits than you should, you must pay them back. 
79 - When will we review your case? 
80 - An eligibility review form will be sent before your benefits stop. 
81 - 01/201502/2015 
82 - Total Gross Income Total ResourcesMedical ProgramsHousehold 

То, что я хочу, чтобы это:

77 - You could receive the wrong amount. 
78 - If you receive more benefits than you should, you must pay them back. 
79 - When will we review your case? 
80 - An eligibility review form will be sent before your benefits stop. 
81 - 01/201502/2015 
82 - Total Gross Income 
83 - Total ResourcesMedical ProgramsHousehold 

Что я делаю неправильно?

+1

Привет там, пожалуйста, добавьте на ваш вопрос несколько примеров и из того, что должно быть в силе и которые нет. Таким образом, вы получите помощь быстрее. –

+0

@JorgeCampos Спасибо за предложение. Я уточнил свой вопрос, чтобы быть более ясным. –

+0

нет отметки о разрыве после 'Total Bross Income' – Deadooshka

ответ

1

Ваша проблема заключается в объявлении пробела, которое следует за вашим взглядом - для разделения требуется хотя бы одно пустое пространство, но если вы его удалите, вы в конечном итоге захватите предыдущее письмо и сломаете все это.

Таким образом, насколько я могу судить, вы не можете сделать это полностью с поисковыми окнами. Вам все равно нужно, чтобы какое-то выражение работало с lookarounds (пробел, которому предшествуют пунктуация и т. Д.), Но для определенных фраз вы не можете.

Вы также можете использовать флаг PREG_SPLIT_DELIM_CAPTURE, чтобы узнать, что вы ищете. Что-то, как это должно вам начать:

$re = '/((?<=[\.\?\!])\s+|Total\sGross\sIncome)/ix'; 

$block_o_text = "You could receive the wrong amount. If you receive more benefits than you should, you must pay them back. When will we review your case? An eligibility review form will be sent before your benefits stop. Total Gross IncomeTotal ResourcesMedical ProgramsHousehold."; 

$sentences = preg_split($re, $block_o_text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

for ($i = 0; $i < count($sentences); ++$i) { 
    if (!ctype_space($sentences[$i])) { 
     echo $i . " - " . $sentences[$i] . "<br>"; 
    } 
} 

Выход:

0 - You could receive the wrong amount. 
2 - If you receive more benefits than you should, you must pay them back. 
4 - When will we review your case? 
6 - An eligibility review form will be sent before your benefits stop. 
8 - Total Gross Income 
9 - Total ResourcesMedical ProgramsHousehold. 
+0

Спасибо! Это была именно информация, необходимая мне для того, чтобы заставить меня двигаться в правильном направлении. –

Смежные вопросы