Разбить строку словами punctionation - PullRequest
0 голосов
/ 09 апреля 2011

Чтобы разделить строку, я придумываю ...

<php
    preg_match_all('/(\w)|(,.!?;)/', "I'm a little teapot, short and stout.", $matches);
    print_r($matches[0]);

Я думал, что это разделит каждое слово (\ w) и указанную пунктуацию (,.??;). Например: ["I'm", "a", "little", "teapot", ",", "short", "and", "stout", "."]

Вместо этого я получаю:

Array
(
    [0] => I
    [1] => m
    [2] => a
    [3] => l
    [4] => i
    [5] => t
    [6] => t
    [7] => l
    [8] => e
    [9] => t
    [10] => e
    [11] => a
    [12] => p
    [13] => o

и т.д ...

Что я здесь не так делаю?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 09 апреля 2011

У вас есть две ошибки:

  1. \w соответствует только одному символу. Вы хотите сопоставить несколько на \w+. Кроме того, \w соответствует только буквенно-цифровым символам. Если вы хотите сопоставить другие символы, такие как ', вам необходимо включить их: [\w'].
  2. (,.!?;) соответствует последовательности символов ,.!?;. Вместо этого вы хотите сопоставить любой из этих символов, используя [,.!?;].

Правильное регулярное выражение:

'/[\w\']+|[,.!?;]/'

Если вы хотите быть более строгим, вам следует использовать вместо этого классы символов Юникода (допускает использование букв, цифр, знаков сочетания, тире и апостроф для слов и знаков препинания):

'/[\pL\pN\pM\pPd\']+|\pP/u'
1 голос
/ 09 апреля 2011

Вы можете попробовать что-то вроде:

/([^,.!?; ]+)|(,.!?;)/
1 голос
/ 09 апреля 2011

Попробуйте - убедитесь, что работает так, как вы хотите:

([\w]+)|[,.!?;]+

Также хочу поделиться с вами одним очень полезным сервисом - онлайн-тестером регулярных выражений

...