我希望能够提取查询的标签名称和值。使用正则表达式来提取标签名称和值
考虑以下查询:
title:(Harry Potter) abc def author:'John' rating:5 jhi cost:"2.20" lmnop qrs
我希望能够提取以下信息:
title => Harry Potter
author => John
rating => 5
cost => 2.20
rest => abc def jhi lmnop qrs
注意标签值可以被包含在“..”。“ ...“ 要么 (...)。它的剂量很重要。
此问题已得到解决使用以下:
$query = "..."; // User input
while (preg_match(
'@(?P<key>title|author|rating|cost):(?P<value>[^\'"(\s]+)@',
$query,
$matches
)) {
echo $matches['key'] . " => " . $matches['value'];
$query = trim(str_replace($matches[0], '', $query));
}
while (preg_match(
'@(?P<key>title|author|rating|cost):[\'"(](?P<value>[^\'")]+)[\'")]@',
$query,
$matches
)) {
echo $matches['key'] . " => " . $matches['value'];
$query = trim(str_replace($matches[0], '', $query));
}
现在,这是正常的情况很多。但是,也有相当多的极端案例:
1)例如考虑:
title:(John's) abc
应该去:
title => John's
rest => abc
而是去
title => (John'
rest => s) abc
2 )还要考虑:
title: (foo (: bar)
应该去:
title => foo (: bar
去:
rest => (foo (bar)
我怎样才能做到这一点?正则表达式甚至是最好的方式吗?我还能如何解决这个问题?
UPDATE修正了一个错误的预期产出的一个
你如何定义你的分隔符和一个选项你的逃生/特殊字符?当你说'标题:(John's)abc'应该转到'title =>(John's)abc'时,这让我认为两个标签之间的每个字符都是标签的一部分。然而,当你写'title:(foo(:bar)'应该到'title => foo(:bar')时,必须删除突然的括号,所以括号看起来是某种分隔符/分隔符......什么是规则? –
@ThomasWilmotte对不起我的错误,现在就修正它! –