preg_match_all表示括号内外的单词

时间:2014-09-05 15:06:08

标签: php regex preg-match-all

我已经坐了好几个小时来为php中的preg_match_all函数找出一个regExp。 我的问题是我从字符串中得到了两个不同的东西。

说你有字符串“代码很有趣[对大脑有益。]但[大脑]累了。”

我需要从括号内的所有单词的数组和括号中的文本一起作为一个字符串。

像这样的东西

[0] => Code
[1] => is
[2] => fun
[3] => and good for the brain.
[4] => But
[5] => the
[6] => brain is
[7] => tired.

非常感谢。

2 个答案:

答案 0 :(得分:3)

你也可以试试下面的正则表达式,

(?<=\[)[^\]]*|[.\w]+

DEMO

<强>代码:

<?php
$data = "Code is fun [and good for the brain.] But the [brain is] tired.";
$regex =  '~(?<=\[)[^\]]*|[.\w]+~';
preg_match_all($regex, $data, $matches);
print_r($matches);
?>

<强>输出:

Array
(
    [0] => Array
        (
            [0] => Code
            [1] => is
            [2] => fun
            [3] => and good for the brain.
            [4] => But
            [5] => the
            [6] => brain is
            [7] => tired.
        )

)

第一个lookbind (?<=\[)[^\]]*匹配大括号[]内的所有字符,第二个[.\w]+匹配剩余字符串中的一个或多个单词字符或点。

答案 1 :(得分:1)

您可以使用以下正则表达式:

(?:\[([\w .!?]+)\]+|(\w+))

正则表达式包含两个替换:一个用于匹配两个方括号内的所有内容,另一个用于捕获每个其他单词。

这假定方括号内的部分不包含字母,数字,_!.?以外的任何字符。如果您需要添加更多标点符号,则应该很容易将它们添加到字符类中。

如果您不想那个具体应该捕获什么,那么您可以使用否定的字符类 - 指定匹配的而不是指定要匹配的内容。然后表达式变为:(?:\[([^\[\]]+)\]|(\w+))

<强>可视化:

<强>解释

(?:              # Begin non-capturing group
  \[             #   Match a literal '['
    (            #   Start capturing group 1
      [\w .!?]+  #     Match everything in between '[' and ']'
    )            #   End capturing group 1
  \]             #   Match literal ']'
  |              #  OR
  (              #   Begin capturing group 2
    \w+          #     Match rest of the words
  )              #   End capturing group 2
)                # End non-capturing group

Demo