我正在处理PHP中的记录,并想知道是否有一种有效的方法来提取类型:来自以下每个记录的值。类型:可以在字符串中的任何位置。
在下面的字符串中,我需要提取“替代”(最后一个字)
这个词[media:keywords] => upc:00602527365589,Records,mercury,artist:Neon
Trees,Alternative,trees,neon,genre:alternative
在下面的字符串中,我需要提取“Latin / Pop,latino,Pop”
[media:keywords] => genre:Latin / Pop,latino,Pop,upc:00602527341217,artist:Luis
Fonsi,luis,universal,Fonsi,Latin
在以下记录中,我需要提取“其他”
[media:keywords] => upc:793018101530,andy,razor,Other,tie,genre:other,artist:Andy
McKee,McKee,&
在下面的记录中,我需要拔出“摇滚,漂浮物,jetsam”
[media:keywords] => and,upc:00602498572061,genre:rock,flotsam,jetsam,artist:Flotsam
And Jetsam,rock,geffen
我正在把头发拉出来(无论如何还剩下什么)。
答案 0 :(得分:2)
答案 1 :(得分:0)
我将使用一个strpos来定义类型的开始位置。你唯一的问题是在哪里结束它,因为你没有分隔符。我应该使用已知的其他关键字,如“upc”,“artist”等来检查字符串是否需要在最后剪切。
答案 2 :(得分:0)
你确实可以使用一些模式检测。您始终在寻找固定的genre:
后跟一个或多个字词或短语,这两个字词或短语本身都不包含:
所以这可能就足够了:
preg_match('~\bgenre:(,?[^:,]+(?=,|$))+~', $media_keywords, $match);
print $match[1];
答案 3 :(得分:0)
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
// Note our use of ===. Simply == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
echo "The string '$findme' was not found in the string '$mystring'";
} else {
echo "The string '$findme' was found in the string '$mystring'";
echo " and exists at position $pos";
}
来自strpos
的PHP文档所以你可以使用$findme = "alternative"
答案 4 :(得分:0)
解析此字符串的问题在于您没有正常的分隔符和/或引号(即逗号分隔字段,但也可能包含在字段中 - 与没有引号的CSV文件存在的问题相同)
如果性能对你来说无关紧要,我会建议用更防弹的方式解析它,比如做一些关于什么是关键的假设(比如艺术家,流派,ups等)并引入一些正常的分隔符,概念证明代码将是:(我留下了回声,所以你可以看到发生了什么)
$string = "genre:Latin / Pop,latino,Pop,upc:00602527341217,artist:Luis Fonsi,luis,universal,Fonsi,Latin";
//introduce a delimiter
$delimiter = '|';
$withDelimiter = preg_replace('/([a-z]+):/', $delimiter . '$0', $string);
echo $withDelimiter . "\n";
$fields = explode($delimiter, $withDelimiter);
foreach ($fields as $field) {
if (strlen($field)) {
echo $field . "\n";
list ($key, $valueWithPossiblyTrailingComma) = explode(':', $field);
if ($key === 'genre') {
$genre = rtrim($valueWithPossiblyTrailingComma, ',');
break;
}
}
}
echo $genre;
你可以在几乎所有的情况下使它工作,并且它允许你不仅找到任何关键类型 - 但它的性能会很低。
我对你的字符串做了以下假设: