HEX
Server: Apache/2.4.65 (Unix) OpenSSL/3.0.2
System: Linux baggio 5.15.0-161-generic #171-Ubuntu SMP Sat Oct 11 08:17:01 UTC 2025 x86_64
User: mkanyafarm (1045)
PHP: 8.3.27
Disabled: NONE
Upload Files
File: /srv/users/mkanyafarm/apps/mkanyafarm/public/wp-content/plugins/booking/core/form_parser.php
<?php

if ( ! defined( 'ABSPATH' ) ) exit;                                             // Exit if accessed directly            // FixIn: 9.8.0.4.


/**
 * Parse booking form  and get  shortcode array
 *
 *  Example:
 *              $form_shortcodes = wpbc_parse_form( $booking_form_fields );
 *
 *
 * @param $booking_form_configuration   - configuration booking form  in shortcodes:    '[calendar]... <p>Time: [select* rangetime "Full Day@@00:00 - 24:00" "10:00 AM - 12:00 PM@@10:00 - 12:00"] ...'
 *
 * @return array
 *
 *              Return example:  [      0 => [
 *                                                'full_shortcode' => '[selectbox rangetime  "10:00 - 11:00" "11:00 - 12:00" "12:00 - 13:00"]',
 *                                                'type' => 'select',
 *                                                'name' => 'rangetime',
 *                                                'options' => '',
 *                                                'values_str' => '"10:00 - 11:00" "11:00 - 12:00" "12:00 - 13:00"',
 *                                                'values_arr' => [
 *                                                                  0 => [ 'value' => '10:00 - 11:00' ],
 *                                                                  1 => [ 'value' => '11:00 - 12:00' ],
 *                                                                  2 => [ 'value' => '12:00 - 13:00' ]
 *                                                                ]
 *                                           ],
 *                                      1 => [
 *                                                'full_shortcode' => '[selectbox rangetime  "10:00 - 12:00" "12:00 - 14:00"]',        <= !!! Several shortcodes with same name - in conditional sections !!!
 *                                                'type' => 'select',
 *                                                'name' => 'rangetime',
 *                                                'options' => '',
 *                                                'values_str' => '"10:00 - 12:00" "12:00 - 14:00"',
 *                                                'values_arr' => [
 *                                                                  0 => [ 'value' => '10:00 - 12:00' ],
 *                                                                  1 => [ 'value' => '12:00 - 14:00' ]
 *                                                                ]
 *                                           ],
 *                                      ...
 *                                      6 => [
 *                                                'full_shortcode' => '[checkbox* term_and_condition use_label_element default:on "I Accept term and conditions@@accept"]',
 *                                                'type' => 'checkbox*',
 *                                                'name' => 'term_and_condition',
 *                                                'options' => 'use_label_element default:on',
 *                                                'values_str' => '"I Accept term and conditions@@accept"',
 *                                                'values_arr' => [
 *                                                                  0 => [  'title' => 'I Accept term and conditions',
 *                                                                          'value' => 'accept',
 *                                                                       ]
 *                                                                ]
 *                                            ],
 *                                      7 => [
 *                                               full_shortcode = "[checkbox fee]"                                      <==  !!! No value !!!
 *                                               type = "checkbox"
 *                                               name = "fee"
 *                                               options = ""
 *                                               values_str = ""
 *                                               values_arr = [ ]                                                       <==  !!! Empty,  if no value !!!
 *                                           ]
 *                               ]
 *
 */
function wpbc_parse_form( $booking_form_configuration ){

	/**
	 * NON-standard shortcodes:
	 *          $regex =                '%\[\s*(' . $types . ')                       (\s+[a-zA-Z][0-9a-zA-Z:._-]*) ([-0-9a-zA-Z:#_/|\s]*)?((?:\s*(?:"[^"]*"|\'[^\']*\'))*)?\s*\]%';
	 *		    $regex_start_end_time = '%\[\s*(country[*]?|starttime[*]?|endtime[*]?)(\s*[a-zA-Z]*[0-9a-zA-Z:._-]*)([-0-9a-zA-Z:#_/|\s]*)*((?:\s*(?:"[^"]*"|\'[^\']*\'))*)?\s*\]%';
	 *		    $regex_submit_ =        '%\[\s*submit                                                             (\s[-0-9a-zA-Z:#_/\s]*)?    (\s+(?:"[^"]*"|\'[^\']*\'))?\s*\]%';
	 */

	// Parse select  shortcodes
	$rx_shortcode_types   = 'text[*]?|email[*]?|coupon[*]?|time[*]?|textarea[*]?|select[*]?|selectbox[*]?|checkbox[*]?|radio[*]?|acceptance|captchac|captchar|file[*]?|quiz';
	// $rx_shortcode_types= 'select[*]?|selectbox[*]?|checkbox[*]?|radio[*]?';
	$rx_shortcode_name    = '\s+[a-zA-Z][0-9a-zA-Z:._-]*';
	$rx_shortcode_options = '[-0-9a-zA-Z:#_/|\s]*';
	$rx_shortcode_values  = '(?:\s*(?:"[^"]*"|\'[^\']*\'))*';
	$regex = '%\[\s*(' . $rx_shortcode_types . ')(' . $rx_shortcode_name . ')(' . $rx_shortcode_options . ')?(' . $rx_shortcode_values . ')?\s*\]%';
	preg_match_all( $regex, $booking_form_configuration, $found_shortcodes, PREG_SET_ORDER );


	/**
	 *        [   [0] => [radio name id:htmlID class:class_name default:Default Value use_label_element label_first "Title A@@1" "Title Booking@@2" ""Title C"@@3" "Other title@@4"]
	 *            [1] => radio
	 *            [2] =>  name
	 *            [3] =>  id:htmlID class:class_name default:Default Value use_label_element label_first
	 *            [4] => "Title A@@1" "Title Booking@@2" ""Title C"@@3" "Other title@@4"
	 *        ]
	 *    OR
	 *        [
	 *           [0] => [select* rangetime "Full Day@@00:00 - 24:00" "10:00 AM - 12:00 PM@@10:00 - 12:00" "12:00 PM - 02:00 PM@@12:00 - 14:00" "02:00 PM - 04:00 PM@@14:00 - 16:00" "04:00 PM - 06:00 PM@@16:00 - 18:00" "06:00 PM - 08:00 PM@@18:00 - 20:00"]
	 *           [1] => select*
	 *           [2] =>  rangetime
	 *           [3] =>
	 *           [4] => "Full Day@@00:00 - 24:00" "10:00 AM - 12:00 PM@@10:00 - 12:00" "12:00 PM - 02:00 PM@@12:00 - 14:00" "02:00 PM - 04:00 PM@@14:00 - 16:00" "04:00 PM - 06:00 PM@@16:00 - 18:00" "06:00 PM - 08:00 PM@@18:00 - 20:00"
	 *        ]
	 */
	$form_shortcodes = array();
	foreach ( $found_shortcodes as $found_shortcode ) {

		$shortcode_config = array();
		$shortcode_config['full_shortcode'] = trim( $found_shortcode[0] );
		$shortcode_config['type']           = trim( $found_shortcode[1] );
		$shortcode_config['name']           = trim( $found_shortcode[2] );
		$shortcode_config['options']        = trim( $found_shortcode[3] );
		$shortcode_config['values_str']         = trim( $found_shortcode[4] );
		$shortcode_config['values_arr'] = array();

		if ( ! empty( $shortcode_config['values_str'] ) ) {
			$shortcode_config['values_arr'] = wpbc_parse_form_shortcode_values( $shortcode_config['values_str'] );
		}

		$form_shortcodes[] = $shortcode_config;
 	}

	return $form_shortcodes;
}


	function wpbc_parse_form_shortcode_values( $shortcode_values ){

		$values_arr = array();

		// $shortcode_values  == '"Full Day@@00:00 - 24:00" "10:00 AM - 12:00 PM@@10:00 - 12:00"... '
		$regex = '%(?:"[^"]*"|\'[^\']*\')%';
		preg_match_all( $regex, $shortcode_values, $found_values, PREG_PATTERN_ORDER );

		/**
		 *	$found_values == 	[   0 => [  [0] => "Full Day@@00:00 - 24:00"
		 *						            [1] => "10:00 AM - 12:00 PM@@10:00 - 12:00"
		 *						            [2] => "12:00 PM - 02:00 PM@@12:00 - 14:00"
		 *						            [3] => "02:00 PM - 04:00 PM@@14:00 - 16:00"
		 *						            [4] => "04:00 PM - 06:00 PM@@16:00 - 18:00"
		 *						            [5] => "06:00 PM - 08:00 PM@@18:00 - 20:00"
		 *						         ]
		 *						]
		 */

		foreach ( $found_values as $found_value ) {

			$found_value = array_map(	function ( $value ) {
											$value = trim( $value );
											$value = trim( $value, '"' );
											$value = trim( $value, "'" );
											$value = explode( '@@', $value );
											return $value;
										}
										, $found_value
									);

			foreach ( $found_value as $f_v ) {
				$value_config_arr = array();
				if ( 1 == count( $f_v )  ) {
					$value_config_arr['value'] = $f_v[0];
				}
				if ( 2 == count( $f_v )  ) {
					$value_config_arr['title'] = $f_v[0];
					$value_config_arr['value'] = $f_v[1];
				}
				$values_arr[] = $value_config_arr;
			}
		}

		return $values_arr;
	}


// ====================================================================================================================

/**
 * Get parsed array of shortcodes with specific Name
 *
 *    Example:
 *              $form_shortcodes = wpbc_parse_form__get_shortcodes_with_name( 'rangetime', $booking_form_fields );
 *
 * @param string $shortcode_name             'rangetime'
 * @param string $booking_form_configuration '[calendar]... <p>Time: [select* rangetime "Full Day@@00:00 - 24:00" "12:00 - 14:00"] ...'
 *
 * @return array      = [
 *                            [0] =>   [
 *                                        [full_shortcode] => [selectbox rangetime  "Full Day@@00:00 - 24:00" "12:00 - 14:00"]
 *                                        [type] => select
 *                                        [name] => rangetime
 *                                        [options] =>
 *                                        [values_str] => "Full Day@@00:00 - 24:00" "12:00 - 14:00"
 *                                        [values_arr] => [
 *                                                            [0] => [
 *                                                                        [title] => Full Day
 *                                                                        [value] => 00:00 - 24:00
 *                                                                   ]
 *                                                            [1] => [
 *                                                                        [value] => 12:00 - 14:00
 *                                                                   ]
 *                                                        ]
 *                                    ],
 *                            [1] =>  [
 *                                        [full_shortcode] => [selectbox rangetime  "14:00 - 16:00" "16:00 - 18:00" "18:00 - 20:00"]
 *                                        [type] => select
 *                                        [name] => rangetime
 *                                        [options] =>
 *                                        [values_str] => "14:00 - 16:00" "16:00 - 18:00" "18:00 - 20:00"
 *                                        [values_arr] => [
 *                                                            [0] => [
 *                                                                        [value] => 14:00 - 16:00
 *                                                                   ]
 *                                                            [1] => [
 *                                                                        [value] => 16:00 - 18:00
 *                                                                   ]
 *                                                            [2] => [
 *                                                                        [value] => 18:00 - 20:00
 *                                                                   ]
 *                                                        ]
 *                                    ]
 *                             , ...
 *                      ]
 */
function wpbc_parse_form__get_shortcodes_with_name( $shortcode_name, $booking_form_configuration ) {

	$form_shortcodes = wpbc_parse_form( $booking_form_configuration );

	$return_shortcode = array();
	foreach ( $form_shortcodes as $form_shortcode ) {
		if ( $shortcode_name == $form_shortcode['name'] ) {
			$return_shortcode[] = $form_shortcode;
		}
	}

	return $return_shortcode;
}


/**
 * Parse booking form  and get value of first  shortcode with  this name. Be careful with conditional  form:
 *              where existing several shortcodes with  the same name. This function return  only  first  shortcode!
 *
 *   Example:
 *              $form_shortcodes = wpbc_parse_form__get_first_shortcode_values( 'rangetime', $booking_form_fields );
 *
 * @param string $shortcode_name                        'rangetime'
 * @param string $booking_form_configuration            '[calendar]... <p>Time: [select* rangetime "Full Day@@00:00 - 24:00" "10:00 AM - 12:00 PM@@10:00 - 12:00"] ...'
 *
 * @return false | array    FALSE  if no field   OR  = [
 *                                                            [0] => [
 *                                                                        [title] => Full Day
 *                                                                        [value] => 00:00 - 24:00
 *                                                                   ]
 *                                                            [1] => [
 *                                                                        [title] => 10:00 AM - 12:00 PM
 *                                                                        [value] => 10:00 - 12:00
 *                                                                   ]
 *                                                                   , ...
 *                                                      ]
 */
function wpbc_parse_form__get_first_shortcode_values( $shortcode_name, $booking_form_configuration ) {

	$form_shortcodes = wpbc_parse_form( $booking_form_configuration );

	$return_shortcode = array();
	foreach ( $form_shortcodes as $form_shortcode ) {
		if ( $shortcode_name == $form_shortcode['name'] ) {
			return $form_shortcode['values_arr'];
		}
	}

	return false;
}