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

时间:2015-03-15 09:24:22

标签: php regex pcre preg-split

我尝试用preg_split分割文本,但我没有得到它的regrex。

示例:

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ÄÖÜäöüß)+)

2 个答案:

答案 0 :(得分:4)

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

$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+水平空间上分割,或者在前一个字符不是非单词字符的位置分割,下一个字符是非单词字符。

交替的RHS是(?<!\W)(?=\W),其中(?<!\W)是负面的后观,这意味着先前的char不是非单词char。然后(?=\W)是正向前瞻,这意味着下一个char是非单词char。

答案 1 :(得分:1)

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

,