automatewoo/includes/Workflows/VariableParsing/VariableParser.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

119 lines
2.8 KiB
PHP

<?php
namespace AutomateWoo\Workflows\VariableParsing;
use AutomateWoo\Clean;
/**
* Class to parse a variable string into separate usable parts.
*
* @since 3.6
* @since 5.4.0 renamed from \AutomateWoo\Workflow_Variable_Parser
*/
class VariableParser {
/**
* Sanitize and parse a variable string into a usable object.
*
* @param string $variable_string The part between the double curly braces.
* e.g. "customer.generate_coupon template: 'abandoned-cart'"
*
* @return ExcludedParsedVariable|ParsedVariable
*
* @throws \Exception If parsing fails.
*/
public function parse( string $variable_string ) {
$variable_string = $this->sanitize( $variable_string );
if ( $this->is_excluded( $variable_string ) ) {
return new ExcludedParsedVariable( $variable_string );
}
$matches = [];
$parameters = [];
// extract the variable name (first part) of the variable string, e.g. 'customer.email'
preg_match( '/([a-z._0-9])+/', $variable_string, $matches, PREG_OFFSET_CAPTURE );
if ( ! $matches ) {
throw new \Exception();
}
$name = $matches[0][0];
// the name must contain a period
if ( ! strstr( $name, '.' ) ) {
throw new \Exception();
}
list( $type, $field ) = explode( '.', $name, 2 );
$parameter_string = trim( substr( $variable_string, $matches[1][1] + 1 ) );
$parameter_string = trim( aw_str_replace_first_match( $parameter_string, '|' ) ); // remove pipe
$parameters_split = preg_split( '/(,)(?=(?:[^\']|\'[^\']*\')*$)/', $parameter_string );
foreach ( $parameters_split as $parameter ) {
if ( ! strstr( $parameter, ':' ) ) {
continue;
}
list( $key, $value ) = explode( ':', $parameter, 2 );
$key = sanitize_key( $key );
$value = $this->unquote( $value );
$parameters[ $key ] = $value;
}
return new ParsedVariable( $name, $type, $field, $parameters );
}
/**
* Sanitize the string contents of a variable (the part between the double curly braces).
*
* @param string $str
* @return string
*/
protected function sanitize( string $str ): string {
// Remove HTML tags and breaks
$str = wp_strip_all_tags( $str, true );
// remove unicode white spaces
$str = preg_replace( "#\x{00a0}#siu", ' ', $str );
$str = trim( $str );
return $str;
}
/**
* Remove single quotes from start and end of a string
*
* @param string $str
*
* @return string
*/
private function unquote( string $str ): string {
return trim( trim( $str ), "'" );
}
/**
* Certain variables can be excluded from processing.
* Currently only {{ unsubscribe_url }}.
*
* @param string $variable
*
* @return bool
*/
protected function is_excluded( string $variable ) {
$excluded = apply_filters(
'automatewoo/variables_processor/excluded',
[
'unsubscribe_url',
]
);
return in_array( $variable, $excluded, true );
}
}