用单词和标点符号分解字符串

时间:2011-04-09 07:37:26

标签: php string preg-match-all

为了分割一个字符串,我想出了......

<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 个答案:

答案 0 :(得分:3)

你有两个错误:

  1. \w只匹配一个字符。您希望按\w+匹配多个。此外,\w仅匹配字母数字字符。如果您想匹配其他字符,例如',则需要包含它们:[\w']
  2. (,.!?;)匹配字符序列,.!?;。相反,您希望使用[,.!?;]匹配任何这些字符。
  3. 正确的正则表达式是:

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

    如果你想更宽容,你应该使用unicode字符类(允许字母,数字,组合标记,短划线字符和撇号用于标点符号和标点符号):

    '/[\pL\pN\pM\pPd\']+|\pP/u'
    

答案 1 :(得分:1)

试试这个 - 确保它可以正常工作:

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

还想与您分享一项非常实用的服务 - online regex tester

答案 2 :(得分:1)

您可能想要尝试以下内容:

/([^,.!?; ]+)|(,.!?;)/