1

我需要一些关于 PHP 的帮助,因为我对它很陌生。

我有这些来自某个位置的字符串集,我需要有条件地从中提取一个字符串子集,只要它存在。

设置:

我得到的每个字符串都有这些Attributes,每个字符串Attribute都有一些Values。所有Attributes都是可选的,并且都Attributes可以有可变数量的值。

这些字符串的模式是这样的:

... Attribute Name: Attribute Values Attribute Name: Attribute Values ...

例如,这里有一些示例字符串:

Attribute A: Value 1, Value 2 Attribute B: Value 3, Value 4, Value 5, Value 6 Attribute C: Value 7, Attribute D: Value 8, Value 9

Attribute A: Value 1, Value 2, Value 3 Attribute B: Value 4, Value 5 Attribute C: Value 6, Value 7, Value 8, Attribute E: Value 9, Value 10, Value 11

Attribute B: Value 1, Value 2, Value 3 Attribute C: Value 4 Attribute D: Value 5, Value 6, Value 7, Value 8 Attribute E: Value 9, Value 10

请注意,某些字符串Attributes缺少一些字符串,并且所有字符串旁边都Attributes可以列出可变数量的字符串。Values

问题:

我想提取 的所有值Attribute D,只要存在Valuesfor Attribute D

所以例如..

对于输入此字符串:

Attribute A: Value 1, Value 2 Attribute B: Value 3, Value 4, Value 5, Value 6 Attribute C: Value 7, Attribute D: Value 8, Value 9

我应该得到这个输出:Value 8, Value 9

对于输入此字符串:

Attribute A: Value 1, Value 2, Value 3 Attribute B: Value 4, Value 5 Attribute C: Value 6, Value 7, Value 8, Attribute E: Value 9, Value 10, Value 11

我应该得到这个输出:空字符串或空字符串,因为Attribute D输入字符串中不存在

对于输入此字符串:

Attribute B: Value 1, Value 2, Value 3 Attribute C: Value 4 Attribute D: Value 5, Value 6, Value 7, Value 8 Attribute E: Value 9, Value 10

我应该得到这个输出:Value 5, Value 6, Value 7, Value 8


我认为这里需要一系列 PHP ifs 和字符串函数,但我想知道是否有人可以记下条件提取代码.. 会加快我的速度:)

自己编写了代码:

我首先将字符串分解为子字符串,:用作分隔符。然后我遍历每个子字符串并搜索Attribute D字符串。如果找到,我知道下一个子字符串将具有Attribute D. 然后我只是从下一个子字符串中删除最后一个单词(即删除下一个Attribute's名称)。

虽然这段代码中有 2 个缺陷(虽然不会在我的环境中发生).. 希望你们能找到它们 :)

这是我使用的最终代码:

<?php

    $subStrings = explode(':',$product['description']);

    $arrayIndexContainingAttributeD = -1;

    $length = count($subStrings);
    for ($i = 0; $i < $length; $i++)
    {
      if(strpos($subStrings[$i], 'Attribute D') != false)
      {
        $arrayIndexContainingAttributeD = $i + 1;
        break;
      }
    }

    $attributeDStringAvailable = false;

    if($arrayIndexContainingAttributeD != -1 && $arrayIndexContainingAttributeD<$length)
    {
        $attributeDString = preg_replace('/\W\w+\s*(\W*)$/', '$1', $subStrings[$arrayIndexContainingAttributeD]);
        $attributeDStringAvailable = true;
    }

?>

<?php if ($attributeDStringAvailable == true) { ?>
<h3><a href="<?php echo $product['href']; ?>"><?php echo $attributeDString; ?></a></h3>
<?php } ?>
4

3 回答 3

0

你可以用一个正则表达式来做到这一点:

$string = 'Attribute A: Value 1, Value 2 Attribute B: Value 3, Value 4, Value 5, Value 6 Attribute C: Value 7, Attribute D: Value 8, Value 9

Attribute A: Value 1, Value 2, Value 3 Attribute B: Value 4, Value 5 Attribute C: Value 6, Value 7, Value 8, Attribute E: Value 9, Value 10, Value 11

Attribute B: Value 1, Value 2, Value 3 Attribute C: Value 4 Attribute D: Value 5, Value 6, Value 7, Value 8 Attribute E: Value 9, Value 10';

preg_match_all('#Attribute D:\s*(.*?)(?:\s*(?:Attribute|$))#s', $string, $m);
print_r($m[1]);

输出:

Array
(
    [0] => Value 8, Value 9
    [1] => Value 5, Value 6, Value 7, Value 8
)
于 2013-05-28T12:57:30.683 回答
0

试图使其尽可能不言自明。例子:

$string = 'Attribute B: Value 1, Value 2, Value 3 Attribute C: Value 4 Attribute D: Value 5, Value 6, Value 7, Value 8 Attribute E: Value 9, Value 10';
$query = 'D';
echo getAttributeValues($string, $query);

function getAttributeValues($string = '', $query = null) {
  if(!strpos($string, $query)) {
    echo 'attribute not in string';
  } else {
    $array = explode('Attribute ', $string);
    $attributes = array_filter($array);

    foreach($attributes as $attribute) {
      if(strpos($attribute, $query.':') !== false) {
        $return = str_replace($query.':', '', $attribute);
        return trim($return);
      }
    }
  }
}

http://phpfiddle.org/main/code/9w8-tn0

于 2013-05-28T11:36:49.250 回答
0

自己编写了代码:

我首先将字符串分解为子字符串,使用 : 作为分隔符。然后我遍历每个子字符串并搜索属性 D 字符串。如果找到,我知道下一个子字符串将具有属性 D 的值。然后我只需从下一个子字符串中删除最后一个单词(即删除下一个属性的名称)。

虽然这段代码中有 2 个缺陷(虽然不会在我的环境中发生).. 希望你们能找到它们 :)

这是我使用的最终代码:

<?php

    $subStrings = explode(':',$product['description']);

    $arrayIndexContainingAttributeD = -1;

    $length = count($subStrings);
    for ($i = 0; $i < $length; $i++)
    {
      if(strpos($subStrings[$i], 'Attribute D') != false)
      {
        $arrayIndexContainingAttributeD = $i + 1;
        break;
      }
    }

    $attributeDStringAvailable = false;

    if($arrayIndexContainingAttributeD != -1 && $arrayIndexContainingAttributeD<$length)
    {
        $attributeDString = preg_replace('/\W\w+\s*(\W*)$/', '$1', $subStrings[$arrayIndexContainingAttributeD]);
        $attributeDStringAvailable = true;
    }

?>

<?php if ($attributeDStringAvailable == true) { ?>
<h3><a href="<?php echo $product['href']; ?>"><?php echo $attributeDString; ?></a></h3>
<?php } ?>
于 2013-05-28T11:53:49.560 回答