PHP - Умоўнае выманне радкі з іншых?

Мне патрэбна дапамога з PHP, так як я вельмі новай для яго.

У мяне ёсць гэтыя набор радкоў, якія паступаюць з месца, і мне трэба ўмоўна вылучыць радок падмноства з яго кожны раз, калі яго няма.

<�Моцны> Set Up:

Кожны радок я мае гэтыя Атрыбуты , і кожны Навык мае некаторы Значэнне . Усе Атрыбуты не з'яўляюцца абавязковымі, і ўсе Атрыбуты можа мець пераменны лік значэнняў.

Характар ​​гэтых радкоў, як гэта:

<�Код> ... Імя атрыбуту: Навык Значэнне атрыбуту Name: Значэнні атрыбутаў ...

Напрыклад, вось некалькі прыкладаў радкоў:

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

Звярніце ўвагу на тое, што некаторыя радкі маюць некаторы Атрыбуты адсутнічае, і ўсе Атрыбуты можа мець пераменны лік Значэнні у спісе побач з ім.

<�Моцны> выпуску:

Я хачу, каб атрымаць усе значэння Attribute D , калі Значэнні для 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

I should get this output: 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

Я павінен атрымаць гэтую выснову: пусты або пусты радок, так як Навык 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

I should get this output: Value 5, Value 6, Value 7, Value 8


Я думаю, што шэраг PHP МФС і радковыя функцыі неабходныя тут, але мне цікава, калі хто-то можа запісаць на ўмоўны код здабывання .. Ці будзе хуткасць мяне шмат :)

<�Моцны> Выраблены код сам:

Я спачатку разбіць радок на падрадка, выкарыстоўваючы : у якасці падзельніка. Тады я іду праз кожную падрадок і пошук Attribute D радка. Калі знойдзены, я ведаю, што наступная падрадок будзе мець значэння для Attribute 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) { ?>

<?php echo $attributeDString; ?>

<?php } ?>
1
Карціна не так .. я выпраўлю гэта цяпер. То за ўказанне, што з!
дададзена аўтар Ahmad, крыніца
Ці з'яўляецца Навык слова заўсёды прысутнічае, ці гэты прыклад? Можа атрыбуты маюць прабелы і іншыя белыя сімвалы? Тыя ж пытанні пра каштоўнасці.
дададзена аўтар Voitcus, крыніца
Ці з'яўляецца Навык слова заўсёды прысутнічае, ці гэты прыклад? Можа атрыбуты маюць прабелы і іншыя белыя сімвалы? Тыя ж пытанні пра каштоўнасці.
дададзена аўтар Voitcus, крыніца
Ці з'яўляецца Навык слова заўсёды прысутнічае, ці гэты прыклад? Можа атрыбуты маюць прабелы і іншыя белыя сімвалы? Тыя ж пытанні пра каштоўнасці.
дададзена аўтар Voitcus, крыніца
Калі дапускаюцца прабелы, як вы сказалі б гэты радок Значэнне 3 Навык B адзін ад аднаго?
дададзена аўтар Voitcus, крыніца
Калі дапускаюцца прабелы, як вы сказалі б гэты радок Значэнне 3 Навык B адзін ад аднаго?
дададзена аўтар Voitcus, крыніца

8 адказы

<�Моцны> Выраблены код сам:

Я спачатку разбіць радок на падрадка, выкарыстоўваючы: у якасці падзельніка. Тады я іду праз кожную падрадок і пошук атрыбутаў 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) { ?>

<?php echo $attributeDString; ?>

<?php } ?>
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) { ?>

<?php echo $attributeDString; ?>

<?php } ?>
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) { ?>

<?php echo $attributeDString; ?>

<?php } ?>
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
)
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
)
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

0
дададзена
Гэта не будзе рэальна працаваць, хоць, таму што ў рэальных прыкладах, Навык імёны не пачынаюцца з «Attribute» обязательно ... Можа быць, я павінен быў растлумачыць, што таксама .. я зрабіў больш ці менш тое ж самае, але ў разабраным выкарыстоўваючы :
дададзена аўтар Ahmad, крыніца

Спрабаваў зрабіць гэта як само сабой тлумачальную наколькі гэта магчыма. прыклад:

$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

0
дададзена
Гэта не будзе рэальна працаваць, хоць, таму што ў рэальных прыкладах, Навык імёны не пачынаюцца з «Attribute» обязательно ... Можа быць, я павінен быў растлумачыць, што таксама .. я зрабіў больш ці менш тое ж самае, але ў разабраным выкарыстоўваючы :
дададзена аўтар Ahmad, крыніца

Спрабаваў зрабіць гэта як само сабой тлумачальную наколькі гэта магчыма. прыклад:

$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

0
дададзена
Гэта не будзе рэальна працаваць, хоць, таму што ў рэальных прыкладах, Навык імёны не пачынаюцца з «Attribute» обязательно ... Можа быць, я павінен быў растлумачыць, што таксама .. я зрабіў больш ці менш тое ж самае, але ў разабраным выкарыстоўваючы :
дададзена аўтар Ahmad, крыніца