php preg_split 没有松散的文本,.: 等等

php preg_split a text without loose ,.: and so forth

我尝试用 preg_split 拆分文本,但我没有得到它的正则表达式。

示例:

I search 1, regex to:  no. Or... yes!

应该得到:

Array
(
    [0] => I
    [1] => search
    [2] => 1
    [3] => ,
    [4] => regex
    [5] => to
    [6] => :
    [7] => no
    [8] => .
    [9] => Or
    [10] => ...
    [11] => yes
    [12] => !
)

我尝试了以下代码:

preg_split("/([\s]+)/", "I search 1, regex to:  no. Or... yes!")

结尾为:

Array
(
    [0] => I
    [1] => search
    [2] => 1,
    [3] => regex
    [4] => to:
    [5] => no.
    [6] => Or...
    [7] => yes!
)

编辑:好的,原来的问题已经解决了,但是我在我的例子中忘记了一些东西:

新示例:

I search 1, regex (regular expression) to: That's it is! Und über den Wolken müssen wir...

应该得到:

array (
  0 => 'I',
  1 => 'search',
  2 => '1',
  3 => ',',
  4 => 'regex',
  5 => '(',
  6 => 'regular',
  7 => 'expression',
  8 => ')',
  9 => 'to',
  10 => ':',
  11 => 'That',
  12 => '\'s',
  13 => 'it',
  14 => 'is',
  15 => '!',
  16 => 'Und',
  17 => 'über',
  18 => 'den',
  19 => 'Wolken',
  20 => 'müssen',
  21 => 'wir',
  22 => '...',
)

一件事是,开头 ( 在第一个解决方案中不匹配。另一件事是,也不是单词内的德语字符 ÄÖÜäöüß 不匹配。

希望更新问题没问题(不是开新问题)

我的 last try 不匹配:

\s+|(?<!(A-Za-z1-0ÄÖÜäöüß)+)(?=(A-Za-z1-0ÄÖÜäöüß)+)

您可以使用这个基于前瞻的正则表达式:

$str = 'I search 1, regex to: no. Or... yes!';
$tok = preg_split('/\h+|(?<!\W)(?=\W)/', $str);

print_r($tok);

Array
(
    [0] => I
    [1] => search
    [2] => 1
    [3] => ,
    [4] => regex
    [5] => to
    [6] => :
    [7] => no
    [8] => .
    [9] => Or
    [10] => ...
    [11] => yes
    [12] => !
)

/\h+|(?<!\W)(?=\W) 是基于交替的正则表达式,它在 1+ 水平 space 或前一个字符不是非字字符且下一个字符是非字字符的位置处拆分。

交替的 RHS 是 (?<!\W)(?=\W),其中 (?<!\W) 是负向后视,这意味着前一个字符不是非字字符。然后 (?=\W) 是积极的前瞻,这意味着下一个字符是一个非单词字符。

我认为除了 's 位之外,您似乎想要作为一个整体 - 这对我来说没有多大意义,因为对于其他标点字符,例如 !, 你想要单独的部分——你可以通过简单地在任何空白或单词边界处分割来实现,

preg_split(
  '#\s|\b#u',
  "I search 1, regex (regular expression) to: That's it is! Und über den Wolken müssen wir...",
  -1,
  PREG_SPLIT_NO_EMPTY
);