1

私はPHPに非常に慣れていないので、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リストされている可能性があることに注意してください。

問題:

forが存在するときはAttribute Dいつでも、のすべての値を抽出したい。ValuesAttribute 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 ifと文字列関数が必要だと思いますが、誰かが条件付き抽出コードを書き留めることができるかどうか疑問に思っています..私を大いにスピードアップします:)

自分でコードを作成しました:

まず、区切り文字として使用して、文字列を部分文字列に分割し:ます。次に、各部分文字列を調べて文字列を検索し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 に答える