【发布时间】:2013-05-28 11:04:35
【问题描述】:
我需要一些关于 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 的所有值,只要Values 和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 } ?>
【问题讨论】:
-
模式错误.. 我现在会更正。那是为了指出这一点!
-
Attribute这个词总是存在,还是这个例子?属性可以有空格和其他白色字符吗?关于价值观的同样问题。 -
如果允许空格,你将如何区分这个字符串
Value 3 Attribute B?