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
)
我正在尝试解析我创建的公式结构。到目前为止,它真的很接近。我只需要一些有关正则表达式的帮助来拆分等号。
这是我正在测试的字符串
({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
)