Php 如何使用可能的多行字符串分析以列分隔的键值文本
我需要解析以下文本:Php 如何使用可能的多行字符串分析以列分隔的键值文本,php,regex,parsing,preg-match-all,Php,Regex,Parsing,Preg Match All,我需要解析以下文本: First: 1 Second: 2 Multiline: blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting Fourth: value 值是一个字符串或多行字符串,同时值可以包含“key:blabla”子字符串。应忽略此类子中心化(不作为单独的键值对进行解析) 请帮助我使用正则表达式或其他算法 理想的结果是: $regex = "/SOME REGEX/"; $matches
First: 1
Second: 2
Multiline: blablablabla
bla2bla2bla2
bla3b and key: value in the middle if strting
Fourth: value
值是一个字符串或多行字符串,同时值可以包含“key:blabla”子字符串。应忽略此类子中心化(不作为单独的键值对进行解析)
请帮助我使用正则表达式或其他算法
理想的结果是:
$regex = "/SOME REGEX/";
$matches = [];
preg_match_all($regex, $html, $matches);
// $mathes has all key and value parsed pairs, including multilines values
多谢各位
我尝试使用简单正则表达式,但结果不正确,因为我不知道如何处理多行:
$regex = "/(.+?): (.+?)/";
$regex = "/(.+?):(.+?)\n/";
...
你可以这样做,只要你考虑一个单词,然后在一行的后面跟着冒号是一个新的键开始:
$data = 'First: 1
Second: 2
Multiline: blablablabla
bla2bla2bla2
bla3b and key: value in the middle if strting
Fourth: value';
preg_match_all('/^([a-z]+): (.*?)(?=(^[a-z]+:|\z))/ims', $data, $matches);
var_dump($matches);
这将产生以下结果:
array(4) {
[0]=>
array(4) {
[0]=>
string(10) "First: 1
"
[1]=>
string(11) "Second: 2
"
[2]=>
string(86) "Multiline: blablablabla
bla2bla2bla2
bla3b and key: value in the middle if strting
"
[3]=>
string(13) "Fourth: value"
}
[1]=>
array(4) {
[0]=>
string(5) "First"
[1]=>
string(6) "Second"
[2]=>
string(9) "Multiline"
[3]=>
string(6) "Fourth"
}
[2]=>
array(4) {
[0]=>
string(3) "1
"
[1]=>
string(3) "2
"
[2]=>
string(75) "blablablabla
bla2bla2bla2
bla3b and key: value in the middle if strting
"
[3]=>
string(5) "value"
}
[3]=>
array(4) {
[0]=>
string(7) "Second:"
[1]=>
string(10) "Multiline:"
[2]=>
string(7) "Fourth:"
[3]=>
string(0) ""
}
}
您可以使用此模式执行此操作:
$pattern = '~(?<key>[^:\s]+): (?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+:|$)~';
preg_match_all($pattern, $txt, $matches, PREG_SET_ORDER);
print_r($matches);
$pattern='~(?[^:\s]+):(?(?(?>[^\n]*\R)*?[^\n]*)(?=\R\s+:|$)~;
preg_match_all($pattern,$txt,$matches,preg_SET_ORDER);
打印(匹配项);
您应该有精确的模式来分割子字符串。在您的场景中,您没有任何确切的模式。在第5行,前面有多个单词:
!=>@埃尼萨伊:是的,我知道,那不是OP想要的?哦,也许你是对的,我没有很好地理解/阅读这个问题。。。但是出于好奇,如果第五行应该被考虑到,那么解决方案是什么呢?@Enissay:key为(?[^:\s]+):\h(?(?[^\n]*\R)*?[^\n:]*(?=\R\s+[:].$)
@Enissay:或者更好的(?[^:\v]+):\h(?(?[^\n:*\R[^\n:])(?=>