【问题标题】:php preg_split a text without loose ,.: and so forthphp preg_split 一个没有松散的文本,.: 等等
【发布时间】:2015-05-17 12:31:19
【问题描述】:

我尝试使用 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ÄÖÜäöüß)+)

【问题讨论】:

  • 我试试但是你现在用哪个代码得到了什么?
  • 对不起,我不知道如何使积极的前瞻工作。我只有 "/[\s]+/" 工作,这一切都结束了:(
  • 这是一个开始!将您当前的代码包含在您的问题中,以便我们查看您的尝试,并更好地向您展示您犯错的地方
  • 我做了一个简单的测试脚本在:link
  • 您的代码应该在问题中而不是非现场链接。

标签: php regex pcre preg-split


【解决方案1】:

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

$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+|(?&lt;!\W)(?=\W) 是基于交替的正则表达式,它在 1+ 水平空间或在前一个字符不是非单词字符且下一个字符是非单词字符的位置分割。

交替的 RHS 是 (?&lt;!\W)(?=\W) 其中(?&lt;!\W) 是负向后看,这意味着前一个字符不是非单词字符。然后(?=\W) 是肯定的前瞻,这意味着下一个字符是非单词字符。

【讨论】:

  • 也许您想向 OP 解释一下您的正则表达式的作用
  • 是的,我刚刚在我的答案中添加了它。
  • 不客气。我添加了一些关于前瞻的更多细节。
  • 好的,我忘记了一件事 - 带有 ( 和 ) 的文本。如果我能找到解决方案,我会尝试自己。但是当我没有添加新评论时:)
  • 好的,我不明白 :( 希望有人可以看看我的更新问题。
【解决方案2】:

我认为除了您似乎想要的 '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
);

【讨论】:

  • 谢谢 - 它现在可以工作了 - 我可以生活 :) link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多