我希望能夠提取查詢的標籤名稱和值。使用正則表達式來提取標籤名稱和值
考慮以下查詢:
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對不起我的錯誤,現在就修正它! –