preg_split в режиме Unicode: delim_capture не работает? - PullRequest
3 голосов
/ 02 февраля 2012

Я пытаюсь использовать регулярное выражение, чтобы разбить кусок китайского текста на предложения.Для моих целей разделителями предложений являются:

  • полная остановка полной ширины。 (0x3002)
  • вопросительный знак полной ширины? (0xFF1F)
  • восклицательный знак полной ширины!(0xFF01)

Теперь предположим, что мой $ str такой: $str = "你好。你好吗? 我是程序员,不太懂这个我问题,希望大家能够帮忙!一起加油吧!";

Я использую preg_split со следующими параметрами:

$str2 = preg_split("/([\x{3002}\x{FF01}\x{FF1F}])/u",$str,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);

$ str2 isтеперь массив выглядит следующим образом:

array(3) { [0]=> string(6) "你好" [1]=> string(9) "你好吗" [2]=> string(91) " 我是程序员,不太懂这个我问题,希望大家能够帮忙!一起加油吧!" }

Однако ожидаемый результат:

[0] "你好。" 
[1] "你好吗?"
[2] "我是程序员,不太懂这个我问题,希望大家能够帮忙!"
[3] "一起加油吧!"

Как видите, есть две проблемы: это не обрабатывает восклицательные знаки должным образоми, во-вторых, исчезают мои вопросительные знаки полной остановки и полной шириныЯ ожидаю, что delim_capture сохранит их.Я так долго смотрю на этот код, что не могу понять, в чем проблема.Я был бы очень признателен за предложения.

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

Ваш код регулярного выражения должен быть таким, чтобы можно было захватить строку + разделитель:

$str = "你好。你好吗? 我是程序员,不太懂这个我问题,希望大家能够帮忙!一起加油吧!";
$arr = preg_split("/\s*([^\x{3002}\x{FF01}\x{FF1F}]+[\x{3002}\x{FF01}\x{FF1F}]\s*)/u",
                  $str, 0, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY );
var_dump($arr);

ВЫВОД:

 array(4) {
  [0]=> string(9)  "你好。"
  [1]=> string(13) "你好吗? "
  [2]=> string(72) "我是程序员,不太懂这个我问题,希望大家能够帮忙!"
  [3]=> string(18) "一起加油吧!"
}
3 голосов
/ 02 февраля 2012

Вам не хватает параметра $limit для preg_split().

массив preg_split (строка $ pattern, строка $ subject [, int $ limit = -1 [, int $ flags = 0]])

В результате вы передаете PREG_SPLIT_DELIM_CAPTURE (2) + PREG_SPLIT_NO_EMPTY (1) = 3 как $limit. Вот почему он останавливается в три.

Добавьте null в качестве параметра $limit, и вы в хорошей форме.

preg_split($pattern, $str, null, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...