php - 将字符串部分与数组值进行比较

标签 php arrays regex string dom

我在 PHP 中有一个字符串构成 HTML 选择框。我也有一个数组。我想要的是:我想将选择框的选项与数组元素进行比较,并且只保留选择框中与数组元素匹配的选项。 以下是使概念更加清晰的代码。

形成选择框的字符串是:

 $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');

经过比较,我想要的字符串为:

$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>';

我试过使用 DOM 这给了我来自字符串的选项文本。但是我被困在了这里,找不到进一步前进的方法。

$dom = new DOMDocument();
$dom->loadHTML($str);
$xpath = new DOMXPath($dom);

$options = $xpath->query('//select/option'); 

foreach ($options as $option) {
    echo $option->nodeValue;
}

最佳答案

您可以像下面这样使用正则表达式的功能。但请记住它只适用于您的类型,这意味着只有在您有选择和选项标签时才有效。

$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);

编辑 如果您有任何包含您的 select option 案例的 html,请使用下面编辑的:

$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);

关于php - 将字符串部分与数组值进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33116925/

相关文章:

c - 为什么第二个数组写的是愚蠢的数字? - C语言

php - 选择一个表中的所有值和另一表中的一些值并用 php 显示它们

php - PHP 脚本中的一般 "Killed"错误

php - 使用 NuSOAP 检索结果时出现 XML 错误(无效字符)

java - 为什么我无法在嵌套迭代中迭代该数组的对象?

javascript - AngularJS - 创建一个 float 的向下滚动/返回顶部按钮

regex - Powershell正则表达式删除逗号但不删除分隔符

python - str.replace 带括号的函数

javascript - PHP 和 JS : HTTP or HTTPS

JavaScript 匹配包含特定前缀的文件