PHP 使用 preg_split 拆分字符串

PHP Splitting string using preg_split

我正在尝试解析我创建的公式结构。到目前为止,它真的很接近。我只需要一些有关正则表达式的帮助来拆分等号。

这是我正在测试的字符串

({1+1=2|2+2=4}+{1+2=3|2+3=5})=16+10

这是我目前得到的输出

array(6) {
  [0]=>
  string(1) "("
  [1]=>
  string(13) "{1+1=2|2+2=4}"
  [2]=>
  string(1) "+"
  [3]=>
  string(13) "{1+2=3|2+3=5}"
  [4]=>
  string(1) ")"
  [5]=>
  string(6) "=16+10"
}

[编辑] - 抱歉忘了表达。

$logical_test_parts = preg_split( "/({.+?})([\)|=|\+?])/" , $logical_test, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

我遇到的问题在索引 5 上。

我需要索引 5 为 "=",索引 6 为 16+10

非常感谢任何帮助

如果你想删除等号,你应该试试这个:

<?php

  $txt='({1+1=2|2+2=4}+{1+2=3|2+3=5})=16+10';

  $re1='.*?';   # Non-greedy match on filler
  $re2='(=)';   # Any Single Character 1
  $re3='.*?';   # Non-greedy match on filler
  $re4='(=)';   # Any Single Character 2
  $re5='.*?';   # Non-greedy match on filler
  $re6='(=)';   # Any Single Character 3
  $re7='.*?';   # Non-greedy match on filler
  $re8='(=)';   # Any Single Character 4
  $re9='.*?';   # Non-greedy match on filler
  $re10='(=)';  # Any Single Character 5

  if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5.$re6.$re7.$re8.$re9.$re10."/is", $txt, $matches))
  {
      $c1=$matches[1][0];
      $c2=$matches[2][0];
      $c3=$matches[3][0];
      $c4=$matches[4][0];
      $c5=$matches[5][0];
      print "($c1) ($c2) ($c3) ($c4) ($c5) \n";
  }

?>

快速而肮脏的处理方式。代码已由 https://txt2re.com/ 生成。它是 RegEx

的一个非常好的工具

正则表达式[()=]|\{[^\}]+\}|[+-]|[^=]+$

通过 @anubhava,您可以将正则表达式简化为:{[^}]+}|[()=+-]|[^=()]+

详情:

  • [] 匹配列表中存在的单个字符
  • [^] 匹配列表中不存在的单个字符
  • + 匹配一次到无限次
  • $ 断言字符串末尾的位置
  • |

PHP代码:

$text = '({1+1=2|2+2=4}+{1+2=3|2+3=5})=16+10';
preg_match_all("/[()=]|\{[^\}]+\}|[+-]|[^=]+$/", $text, $matches);
print_r($matches[0]);

输出:

Array
(
    [0] => (
    [1] => {1+1=2|2+2=4}
    [2] => +
    [3] => {1+2=3|2+3=5}
    [4] => )
    [5] => =
    [6] => 16+10
)

Code demo