I have one string in PHP that forms HTML select box. I am also having one array. What I want is: I want to compare options of the select box with array elements and only keep the options in select box that match with array elements. Following is the code that will make the concept more clear.
String forming select box is:
$str = '<select name="options[45]" id="select_45" class=" required-entry product-custom-option" title="" onchange="opConfig.reloadPrice()">
<option value="" >-- Please Select --</option>
<option value="76" price="0" >Certified Networking </option>
<option value="89" price="0" >Certified Virtualization </option>
<option value="90" price="0" >Certified Expert Virtualization </option><option value="91" price="0" >Certified Mobility </option>
<option value="92" price="0" >Certified Professional Networking </option><option value="93" price="0" >Certified Professional Virtualization </option>
</select>';
Array is:
$array = array('-- Please Select --','Certified Networking', 'Certified Mobility');
After comparison, I want string as:
$str = '<select name="options[45]" id="select_45" class=" required-entry product-custom-option" title="" onchange="opConfig.reloadPrice()">
<option value="" >-- Please Select --</option>
<option value="76" price="0" >Certified Networking </option>
<option value="91" price="0" >Certified Mobility </option>
</select>';
I have tried using DOM This is giving me the option text from string. But I am stuck at this and can't find the way to move further.
$dom = new DOMDocument();
$dom->loadHTML($str);
$xpath = new DOMXPath($dom);
$options = $xpath->query('//select/option');
foreach ($options as $option) {
echo $option->nodeValue;
}
you can use regular expression's power like below. but remember it only works for your type, this means only work if you have an select and options tag.
$str = '<select name="options[45]" id="select_45" class=" required-entry product-custom-option" title="" onchange="opConfig.reloadPrice()">
<option value="" >-- Please Select --</option>
<option value="76" price="0" >Certified Networking </option>
<option value="89" price="0" >Certified Virtualization </option>
<option value="90" price="0" >Certified Expert Virtualization </option><option value="91" price="0" >Certified Mobility </option>
<option value="92" price="0" >Certified Professional Networking </option><option value="93" price="0" >Certified Professional Virtualization </option>
</select>';
$array = array('-- Please Select --','Certified Networking', 'Certified Mobility');
foreach ($array as $index=>$value) {
$array[$index] = preg_replace(array('/([\-\+\*\$\^\{\}\[\]\<\>\.\?\\/\\\\])/', '/\s+/'), array('\\\\$1', '\\\\s+'), $value);
}
$str = explode("\n", str_replace('</option><option', "</option>\n<option", $str));
$regexp = '/^(?:\s*(?:\<\/?select[^\>]*\>[^\n]*|\<option[^\>]*\>\s*(?:'.implode('|', $array).')\s*\<[^\n]*)\s*)$/i';
foreach($str as $index=>$value) {
if (!preg_match($regexp, $value, $match)) {
unset($str[$index]);
}
}
$str = implode("\n",$str);
Edit
In case you have any html that contains your select option case, use the one edited below:
$str = '<select name="options[45]" id="select_45" class=" required-entry product-custom-option" title="" onchange="opConfig.reloadPrice()">
<option value="" >-- Please Select --</option>
<option value="76" price="0" >Certified Networking </option>
<option value="89" price="0" >Certified Virtualization </option>
<option value="90" price="0" >Certified Expert Virtualization </option><option value="91" price="0" >Certified Mobility </option>
<option value="92" price="0" >Certified Professional Networking </option><option value="93" price="0" >Certified Professional Virtualization </option>
</select>';
$array = array('-- Please Select --', 'Certified Networking', 'Certified Mobility');
foreach ($array as $index => $value) {
$array[$index] = preg_replace(
array('/([\-\+\*\$\^\{\}\[\]\<\>\.\?\\/\\\\])/', '/\s+/'),
array('\\\\$1', '\\\\s+'),
$value
);
}
$str = explode("\n", str_replace('</option><option', "</option>\n<option", $str));
$regexp = '/^(?:\s*(?:\<option[^\>]*\>\s*(?:' . implode('|', $array) . ')\s*\<[^\n]*)\s*)$/i';
foreach ($str as $index => $value) {
if (stripos($value, '<option') !== false && !preg_match($regexp, $value, $match)) {
unset($str[$index]);
}
}
$str = implode("\n", $str);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With