Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用特定的正则表达式规则将单个字符串拆分为数组_Php_Regex - Fatal编程技术网

Php 使用特定的正则表达式规则将单个字符串拆分为数组

Php 使用特定的正则表达式规则将单个字符串拆分为数组,php,regex,Php,Regex,我正在处理一个包含多对数据的字符串。每对由分隔符号。每对包含一个数字和一个字符串,由=符号分隔 我认为这很容易处理,但我发现这对字符串的一半可以包含=和符号,使简单拆分不可靠 下面是一个有问题字符串的示例: 123=one; two;45=three=four;6=five; 为了正确处理此数据,我需要将其拆分为如下数组: '123', 'one; two' '45', 'three=four' '6', 'five' 我有点走投无路了,所以非常感谢你的帮助 更新: 感谢大家的帮助,这

我正在处理一个包含多对数据的字符串。每对由
分隔符号。每对包含一个数字和一个字符串,由
=
符号分隔

我认为这很容易处理,但我发现这对字符串的一半可以包含
=
符号,使简单拆分不可靠

下面是一个有问题字符串的示例:

123=one; two;45=three=four;6=five;
为了正确处理此数据,我需要将其拆分为如下数组:

'123', 'one; two'
'45',  'three=four'
'6',   'five'
我有点走投无路了,所以非常感谢你的帮助

更新:

感谢大家的帮助,这就是我目前的处境:

$input = '123=east; 456=west';

// split matches into array
preg_match_all('~(\d+)=(.*?);(?=\s*(?:\d|$))~', $input, $matches);

$newArray = array();

// extract the relevant data
for ($i = 0; $i < count($matches[2]); $i++) {
    $type   = $matches[2][$i];
    $price  = $matches[1][$i];

    // add each key-value pair to the new array
    $newArray[$i] = array(
        'type'      => "$type",
        'price'     => "$price"
    );
}
第二项丢失,因为它的结尾没有分号,我不知道如何修复它

我现在意识到,这对字符串的数字部分有时包含一个小数点,最后一对字符串后面没有分号。任何提示都将不胜感激,因为我运气不太好

以下是更新的字符串,其中考虑了我在初始问题中遗漏的内容(对不起):


我想这就是你想要的正则表达式:

\s*(\d+)\s*=(.*?);(?=\s*(?:\d|$))
技巧是只考虑一个数字后面的分号作为匹配的结束。这就是最后的展望


您可以在上看到详细的可视化视图。

我想这就是您想要的正则表达式:

\s*(\d+)\s*=(.*?);(?=\s*(?:\d|$))
技巧是只考虑一个数字后面的分号作为匹配的结束。这就是最后的展望


您可以在上看到一个详细的可视化视图。

尝试一下,但这段代码是用c#编写的,您可以将其更改为php

 string[] res = Regex.Split("123=one; two;45=three=four;6=five;", @";(?=\d)");

--SJ

试试这个,但是这段代码是用c#编写的,你可以把它改成php

 string[] res = Regex.Split("123=one; two;45=three=four;6=five;", @";(?=\d)");

--SJ

您可以使用以下
preg\u match\u all
代码来捕获:

$str = '123=one; two;45=three=four;6=five;';
if (preg_match_all('~(\d+)=(.+?);(?=\d|$)~', $str, $arr))
   print_r($arr);

现场演示:您可以使用以下
preg\u match\u all
代码来捕获:

$str = '123=one; two;45=three=four;6=five;';
if (preg_match_all('~(\d+)=(.+?);(?=\d|$)~', $str, $arr))
   print_r($arr);
现场演示: 然后y可以组合

Array
(
    [123] => one; two;
    [45] => three=four;
    [6] => five;
)
然后y可以组合

Array
(
    [123] => one; two;
    [45] => three=four;
    [6] => five;
)

为此,您需要一个前瞻性断言;如果a
,则前瞻匹配后接数字或字符串结尾:

输出:

数组
(
[12.30]=>一个;两个
[45]=>3=4
[600.00]=>5个
)

对此,您需要一个前瞻性断言;如果a
,则前瞻匹配后接数字或字符串结尾:

输出:

数组
(
[12.30]=>一个;两个
[45]=>3=4
[600.00]=>5个
)

您希望有一个由6个元素组成的平面数组吗?如果是
出现在数组对中,它后面总是跟一个空格吗?我正在使用array\u combine按我想要的方式对数组进行排序,即
[123]=>一;二,等等<代码>
=
在配对中并不总是后跟空格。谢谢。好的,我不再使用array\u combine了,因为它扰乱了结果的顺序。相反,我正在遍历matches数组,并使用正确的键值对和正确的顺序创建一个新数组!你想要一个6个元素的平面数组吗?如果是
出现在数组对中,它后面总是跟一个空格吗?我正在使用array\u combine按我想要的方式对数组进行排序,即
[123]=>一;二,等等<代码>
=
在配对中并不总是后跟空格。谢谢。好的,我不再使用array\u combine了,因为它扰乱了结果的顺序。相反,我正在遍历matches数组,并使用正确的键值对和正确的顺序创建一个新数组!谢谢,这很好,尽管我现在意识到这对字符串的数字部分有时包含一个小数点,并且最后一对字符串后面没有分号。任何提示都将不胜感激,我正在RegexBuddy中玩,但没走多远。干杯。谢谢,这很好,尽管我现在意识到这对字符串的数字部分有时包含小数点,最后一对字符串后面没有分号。任何提示都将不胜感激,我正在RegexBuddy中玩,但没走多远。干杯
Array
(
    [123] => one; two;
    [45] => three=four;
    [6] => five;
)
$s = '12.30=one; two;45=three=four;600.00=five';

preg_match_all('/(\d+(?:.\d+)?)=(.+?)(?=(;\d|$))/', $s, $matches);

print_r(array_combine($matches[1], $matches[2]));