通过正则表达式拆分表达式(PHP)

时间:2013-10-07 11:47:28

标签: php regex

我想在“33”,“A”,“5”部分拆分字符串:“33A / 5”。

是否有可能将某些正则表达式写成:"/^(\d+) (\D) \/? (\d+)/",其中括号( exp )中的表达式成为单独的部分?

2 个答案:

答案 0 :(得分:3)

您可以像这样使用preg_match

preg_match("/^(\d+) (\D+) \/? (\d+)/x", $text, $match);

$match将是一个包含单独匹配的数组。

x修饰符是忽略正则表达式中的空格;否则,不要把空格:

preg_match("/^(\d+)(\D+)\/?(\d+)/", $text, $match);

答案 1 :(得分:1)

这也可以使用单个preg_split调用来完成:

$chunks = preg_split(
    '/(\d+|[^\/\d]+)\/?/',
    '33A/5',
    -1,
    PREG_SPLIT_DELIM_CAPTURE |
    PREG_SPLIT_NO_EMPTY
);
var_dump($chunks);

转储:

array(3) {
  [0]=>
  string(2) "33"
  [1]=>
  string(1) "A"
  [2]=>
  string(1) "5"
}

as shown here

这种方法与[答案]大致相同。表达式匹配除/之外的所有内容,有效地将您想要的数据转换为分隔符。因为我们想要分隔符,所以必须使用PREG_SPLIT_DELIM_CAPTURE常量 当然,由于它们是分隔符,它会将字符串拆分为这些子字符串,并且由于分隔符之间没有任何内容,因此每个 split -point最终都会得到一个空值,如它是。这就是为什么我也使用PREG_SPLIT_NO_EMPTY常量,使用按位|运算符

表达本身:

  • (:开始匹配群组
  • \d+匹配一个或多个数字,贪婪 - >小组!
  • |:或者,如果\d+无法匹配,请使用:
  • [^\/\d]+:任何不是/或数字的字符的贪婪匹配 - >在小组
  • )\/?:关闭群组,匹配可选 /,群组外=>所以它不是匹配的捕获分隔符的一部分