PHP从字符串中提取值

时间:2012-01-06 13:34:12

标签: php regex substr

我正在处理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

我正在把头发拉出来(无论如何还剩下什么)。

5 个答案:

答案 0 :(得分:2)

使用以下正则表达式和preg_match()

~\bgenre:(.+?)(?=(,[^:,]+:|$))~

您想要的结果将位于匹配数组的第一个元素(paremeter 3)中。

答案 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;

你可以在几乎所有的情况下使它工作,并且它允许你不仅找到任何关键类型 - 但它的性能会很低。

我对你的字符串做了以下假设:

  • 它是key =>的列表由冒号分隔并与逗号连接的值对
  • 键可能只有[a-z]个字符