string matching position.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Bob Bedford

    string matching position.

    Hello,

    I've a string and all sort of values in wich I've to check and return the
    correct value.

    Here is a sample (simplified as I've a huge amount of datas):

    code = 1
    subcode 65 values 06101;06102;061 03;06106;06108; 06109
    subcode 69 values 07003;07004;070 07;07008;07009; 07012;07013

    code = 2
    subcode 65 values 61215;61218;615 58;61587
    subcode 69 values 83662:83667;836 68

    Now I've a given code and value and I need to know the subcode.

    I mean if I give the function code=1 and value = 06108 then the function
    should return 65
    if I give the function code=2 and value = 83668 then the returned subcode
    must be 69

    How to do so ?

    Thanks for helping.

    Bob


  • petersprc

    #2
    Re: string matching position.

    Hi,

    You need a small routine to parse the data into an array.

    This script will do it:

    <?

    function parseData($txt)
    {
    $lines = split("\n", $txt);
    $codes = array();
    $code = null;

    for ($i = 0; $i < count($lines); $i++) {
    $line = $lines[$i];
    if (preg_match('/^code = (\d+)$/', $line, $m)) {
    $code = $m[1];
    } elseif (preg_match('/^subcode (\d+) values ((?:\d+;)*(?:\d +))
    $/',
    $line, $m)) {
    if (is_null($code) ) {
    throw new Exception('No code set at line ' . ($i + 1) . '.');
    }
    $vals = split(';', $m[2]);
    foreach ($vals as $val) {
    $codes[$code][$val] = $m[1];
    }
    } elseif ($line == '') {
    if (is_null($code) ) {
    throw new Exception('Unex pected empty line at line ' .
    ($i + 1) . '.');
    }
    $code = null;
    } else {
    throw new Exception('Unab le to process line ' . ($i + 1) . '.');
    }
    }

    return $codes;
    }

    function getSubcode($cod es, $code, $val)
    {
    return isset($codes[$code]) && isset($codes[$code][$val]) ?
    $codes[$code][$val] : false;
    }

    function test()
    {
    $txt = <<<end
    code = 1
    subcode 65 values 06101;06102;061 03;06106;06108; 06109
    subcode 69 values 07003;07004;070 07;07008;07009; 07012;07013

    code = 2
    subcode 65 values 61215;61218;615 58;61587
    subcode 69 values 83662;83667;836 68

    end;

    $codes = parseData($txt) ;

    echo "Subcode for code 1 and value 06108 is " .
    getSubcode($cod es, 1, '06108') . ".<br>\n";

    echo "Subcode for code 2 and value 83668 is " .
    getSubcode($cod es, 2, '83668') . ".<br>\n";

    echo "Subcode for code 3 and value 12345 is " .
    getSubcode($cod es, 3, '12345') . ".<br>\n";
    }

    test();

    ?>

    On Mar 26, 12:22 pm, "Bob Bedford" <b...@bedford.c omwrote:
    Hello,
    >
    I've a string and all sort of values in wich I've to check and return the
    correct value.
    >
    Here is a sample (simplified as I've a huge amount of datas):
    >
    code = 1
    subcode 65 values 06101;06102;061 03;06106;06108; 06109
    subcode 69 values 07003;07004;070 07;07008;07009; 07012;07013
    >
    code = 2
    subcode 65 values 61215;61218;615 58;61587
    subcode 69 values 83662:83667;836 68
    >
    Now I've a given code and value and I need to know the subcode.
    >
    I mean if I give the function code=1 and value = 06108 then the function
    should return 65
    if I give the function code=2 and value = 83668 then the returned subcode
    must be 69
    >
    How to do so ?
    >
    Thanks for helping.
    >
    Bob

    Comment

    • Bob Bedford

      #3
      Re: string matching position.

      Thanks a lot Peter, with your help I've done it.

      "petersprc" <petersprc@gmai l.coma écrit dans le message de news:
      c3299cd2-9bca-483c-a6e3-ff841adc481f...l egroups.com...
      Hi,
      >
      You need a small routine to parse the data into an array.
      >
      This script will do it:
      >
      <?
      >
      function parseData($txt)
      {
      $lines = split("\n", $txt);
      $codes = array();
      $code = null;
      >
      for ($i = 0; $i < count($lines); $i++) {
      $line = $lines[$i];
      if (preg_match('/^code = (\d+)$/', $line, $m)) {
      $code = $m[1];
      } elseif (preg_match('/^subcode (\d+) values ((?:\d+;)*(?:\d +))
      $/',
      $line, $m)) {
      if (is_null($code) ) {
      throw new Exception('No code set at line ' . ($i + 1) . '.');
      }
      $vals = split(';', $m[2]);
      foreach ($vals as $val) {
      $codes[$code][$val] = $m[1];
      }
      } elseif ($line == '') {
      if (is_null($code) ) {
      throw new Exception('Unex pected empty line at line ' .
      ($i + 1) . '.');
      }
      $code = null;
      } else {
      throw new Exception('Unab le to process line ' . ($i + 1) . '.');
      }
      }
      >
      return $codes;
      }
      >
      function getSubcode($cod es, $code, $val)
      {
      return isset($codes[$code]) && isset($codes[$code][$val]) ?
      $codes[$code][$val] : false;
      }
      >
      function test()
      {
      $txt = <<<end
      code = 1
      subcode 65 values 06101;06102;061 03;06106;06108; 06109
      subcode 69 values 07003;07004;070 07;07008;07009; 07012;07013
      >
      code = 2
      subcode 65 values 61215;61218;615 58;61587
      subcode 69 values 83662;83667;836 68
      >
      end;
      >
      $codes = parseData($txt) ;
      >
      echo "Subcode for code 1 and value 06108 is " .
      getSubcode($cod es, 1, '06108') . ".<br>\n";
      >
      echo "Subcode for code 2 and value 83668 is " .
      getSubcode($cod es, 2, '83668') . ".<br>\n";
      >
      echo "Subcode for code 3 and value 12345 is " .
      getSubcode($cod es, 3, '12345') . ".<br>\n";
      }
      >
      test();
      >
      ?>
      >
      On Mar 26, 12:22 pm, "Bob Bedford" <b...@bedford.c omwrote:
      >Hello,
      >>
      >I've a string and all sort of values in wich I've to check and return the
      >correct value.
      >>
      >Here is a sample (simplified as I've a huge amount of datas):
      >>
      >code = 1
      >subcode 65 values 06101;06102;061 03;06106;06108; 06109
      >subcode 69 values 07003;07004;070 07;07008;07009; 07012;07013
      >>
      >code = 2
      >subcode 65 values 61215;61218;615 58;61587
      >subcode 69 values 83662:83667;836 68
      >>
      >Now I've a given code and value and I need to know the subcode.
      >>
      >I mean if I give the function code=1 and value = 06108 then the function
      >should return 65
      >if I give the function code=2 and value = 83668 then the returned subcode
      >must be 69
      >>
      >How to do so ?
      >>
      >Thanks for helping.
      >>
      >Bob
      >
      >

      Comment

      • Alexey Kulentsov

        #4
        Re: string matching position.

        quick&dirty solution

        <?php

        $data=<<<EOD
        code = 1
        subcode 65 values 06101;06102;061 03;06106;06108; 06109
        subcode 69 values 07003;07004;070 07;07008;07009; 07012;07013

        code = 2
        subcode 65 values 61215;61218;615 58;61587
        subcode 69 values 83662;83667;836 68

        EOD;

        // search function
        function smart_search($d ata,$code,$valu e)
        {
        preg_match("/^code = {$code}[^=]+subcode (\\d+) values
        [;\\d]*$value/m",$data,$re s);
        return isset($res[1]) ? $res[1] : false;
        }


        // test it
        foreach(array(' 06101'=>1,'0610 3'=>1,'06109'=> 1,'07009'=>1,'0 7013'=>1
        ,'61215'=>2,'61 587'=>2,'83668' =>2) as $value=>$code)
        echo $value.' '.$code.' : '.smart_search( $data,$code,$va lue)."\n";


        ?>

        I think here was mistake in string 'subcode 69 values 83662:83667;836 68'

        Comment

        Working...