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]));