How to use php markup analysis method to create a separate automated process

I want to create a website with a small automatic process or title, menu, navigation bar, footer, etc., which uses the markdown technique.

for example, navigationbar.md will contain only the link text and the link address, I want to get these details separately (link and text without the parsed html format) into variables or parameters in php.

* [Dog][0]
* [German Shepherd][1]
* [Belgian Shepherd][2]
    * [Malinois][3]
    * [Groenendael][4]
    * [Tervuren][5]
* [Cat][6]
    * [Siberian][7]
    * [Siamese][8]

[0]:(http://google.com)
[1]:(http://google.com)
[2]:(http://google.com)
[3]:(http://google.com)
[4]:(http://google.com)
[5]:(http://google.com)
[6]:(http://google.com)
[7]:(http://google.com)
[8]:(http://google.com)

if no html is needed here id wants the nested array to contain link text and link address

this markdown structure will create the html output as follows

enter image description here

but I need this list as a nested array to perform certain tasks.

let me know if this works .. this is their chance for him

expected output

      array (size=9)
      0 => 
        array (size=2)
          0 => string 'Dog' (length=3)
          1 => string 'http://google.com' (length=17)
      1 => 
        array (size=2)
          0 => string 'German Shepherd' (length=15)
          1 => string 'http://yahoo.com' (length=16)
      2 => 
        array (size=2)
          0 => string 'Belgian Shepherd' (length=16)
          1 => string 'http://duckduckgo.com' (length=21)
          2 => 
            array (size=2)
              0 => string 'Malinois' (length=8)
              1 => string 'http://amazon.com' (length=17)
              2 => 
                array (size=2)
                  0 => string 'Groenendael' (length=11)
                  1 => string 'http://metallica.com' (length=20)
              3 => 
                array (size=2)
                  0 => string 'Tervuren' (length=8)
                  1 => string 'http://microsoft.com' (length=20)
      3 => 
        array (size=2)
          0 => string 'Cat' (length=3)
          1 => string 'http://ibm.com' (length=14)
          2 => 
            array (size=2)
              0 => string 'Siberian' (length=8)
              1 => string 'http://apple.com' (length=16)
          3 => 
            array (size=2)
              0 => string 'Siamese' (length=7)
              1 => string 'http://stackoverflow.com' (length=24)
+4
1

. . -

/**
    This function takes a strings- $text and $links_text.
    For each text value that matches the regular expression, the link
    from the $links_text is extracted and given as output.
    This returns an array consisting of the text mapped to their links.
    It will return a single array if there only single text value, and 
    a nested array if more than one text is found.
    Eg: 
    INPUT:
        var_dump(text_link_map("* [Dog][0]", "[0]:(http://google.com)[1]:(http://yahoo.com)"));
    OUTPUT: 
        array
          0 => string 'Dog' (length=3)
          1 => string 'http://google.com' (length=17)
*/
function text_link_map($text, $links_text){
    $regex= "/\*\s+\[([a-zA-Z0-9\-\_ ]+)\]\[([0-9]+)\]/";
    if(preg_match_all($regex, $text, $matches)){
        $link_arr = Array();
        /*
            For each of those indices, find the appropriate link.
        */
        foreach($matches[2] as $link_index){
            $links = Array();
            $link_regex = "/\[".$link_index."\]\:\((.*?)\)/";
            if(preg_match($link_regex,$links_text,$links)){
                $link_arr[] = $links[1];
            }
        }
        if(count($matches[1]) == 1){
            return Array($matches[1][0], $link_arr[0]);
        }else{
            $text_link = array_map(null, $matches[1], $link_arr);
            return $text_link;
        }
    }else{
        return null;
    }
}

/**
    Function that calls recursive index, and returns it output.
    This is is needed to pass initial values to recursive_index.
*/
function indent_text($text_lines, $links){
    $i = 0;
    return recursive_index($i, 0, $text_lines, $links);
}


/**
    This function creates a nested array out of the $text.
    Each indent is assumed to be a single Tab.It is dictated by the
    $indent_symbol variable.
    This function recursively calls itself when it needs to go from 
    one level to another.
*/
function recursive_index(&$index, $curr_level, $text, $links){
    $indent_symbol = "\t";
    $result = Array();
    while($index < count($text)){
        $line = $text[$index];
        $level = strspn($line, $indent_symbol);
        if($level == $curr_level){
            $result[] = text_link_map($line, $links);
        }elseif($level > $curr_level){
            $result[count($result) - 1][] = recursive_index($index, $curr_level + 1, $text, $links);
            if($index > count($text)){
                break;
            }else{
                $index--;
            }               
        }elseif($level < $curr_level){
            break;
        }
        $index += 1;
    }
    return $result;
}   

$file_name = "navigationbar.md";
$f_contents = file_get_contents($file_name);
//Separate out the text and links part.
//(Assuming the text and the links will always be separated with 2 \r\n)
list($text, $links) = explode("\r\n\r\n", $f_contents);
//Get the nested array.
$formatted_arr = indent_text(explode("\r\n", $text), $links);
var_dump($formatted_arr);

. -

/*
    OUTPUT
*/
array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(3) "Dog"
    [1]=>
    string(17) "http://google.com"
  }
  [1]=>
  array(2) {
    [0]=>
    string(15) "German Shepherd"
    [1]=>
    string(16) "http://yahoo.com"
  }
  [2]=>
  array(3) {
    [0]=>
    string(16) "Belgian Shepherd"
    [1]=>
    string(21) "http://duckduckgo.com"
    [2]=>
    array(3) {
      [0]=>
      array(2) {
        [0]=>
        string(8) "Malinois"
        [1]=>
        string(17) "http://amazon.com"
      }
      [1]=>
      array(2) {
        [0]=>
        string(11) "Groenendael"
        [1]=>
        string(20) "http://metallica.com"
      }
      [2]=>
      array(2) {
        [0]=>
        string(8) "Tervuren"
        [1]=>
        string(20) "http://microsoft.com"
      }
    }
  }
  [3]=>
  array(3) {
    [0]=>
    string(3) "Cat"
    [1]=>
    string(14) "http://ibm.com"
    [2]=>
    array(2) {
      [0]=>
      array(2) {
        [0]=>
        string(8) "Siberian"
        [1]=>
        string(16) "http://apple.com"
      }
      [1]=>
      array(2) {
        [0]=>
        string(7) "Siamese"
        [1]=>
        string(24) "http://stackoverflow.com"
      }
    }
  }
}

, navigationbar.md -

* [Dog][0]
* [German Shepherd][1]
* [Belgian Shepherd][2]
    * [Malinois][3]
    * [Groenendael][4]
    * [Tervuren][5]
* [Cat][6]
    * [Siberian][7]
    * [Siamese][8]

[0]:(http://google.com)
[1]:(http://yahoo.com)
[2]:(http://duckduckgo.com)
[3]:(http://amazon.com)
[4]:(http://metallica.com)
[5]:(http://microsoft.com)
[6]:(http://ibm.com)
[7]:(http://apple.com)
[8]:(http://stackoverflow.com)

-

, navigationbar.md.

, .

+2

Source: https://habr.com/ru/post/1526007/


All Articles