简单的正则表达式添加到我现有的代码

时间:2011-05-16 13:54:06

标签: php

$options = '<select name="extra2"  id="extra2" class="select_smaller">
    <option value="Algema">Algema</option>
    <option value="Barkas">Barkas</option>
.
.
.
</select>';

这是我的代码

/**
 * Return HTML of select field with one option selected, built based
 * on the list of options provided
 * @param mixed $options array of options or HTML of select form field
 * @return string HTML of the select field
 */
function makeSelect($name, $options) {
if (is_string($options)) {
    // assuming the options string given is HTML of select field
    $regex = '/<option value=\"([a-zA-Z0-9]*)\"\>/';
    $count = preg_match_all($regex, $options, $matches);
    if ($count) {
        $options = $matches[1];
    } else {
        $options = array();
    }
}

foreach ($options as &$option) {
    $selected = isset($_GET[$name]) && $_GET[$name] == $option;
    $option = sprintf('<option value="%1$s"%2$s>%1$s</option>',
                      htmlspecialchars($option),
                      $selected ? ' selected="selected"' : null);
}

return sprintf('<select name="%1$s" id="%1$s" class="select">%2$s</select>',
               htmlspecialchars($name),
               join($options));
}

echo makeSelect('extra2', $options);

如何使用正则表达式而不是手动编写选择列表的名称(extra2)?

4 个答案:

答案 0 :(得分:0)

你没有。您使用http://www.php.net/manual/en/book.dom.php解析HTML。

答案 1 :(得分:0)

尝试类似:

<?php
function selectOption($htmlSelect, array $data = array()) {
    $result = $htmlSelect;

    $dom = new DOMDocument();
    if ($dom->loadXml($htmlSelect)) {
        $selectName = $dom->documentElement->getAttribute('name');
        if (isset($data[$selectName])) {
            $xpath = new DOMXPath($dom);

            $optionNodeList = $xpath->query('//option[@value="' . $data[$selectName] . '"]');
            if ($optionNodeList->length == 1) {
                $optionNodeList->item(0)->setAttribute('selected', 'selected');

                $result = $dom->saveXml($dom->documentElement, LIBXML_NOEMPTYTAG);
            }
        }
    }

    return $result;
}

$htmlSelect = '<select name="extra2" id="extra2" class="select_smaller">
    <option value="Algema">Algema</option>
    <option value="Barkas">Barkas</option>
</select>';

echo selectOption(
    $htmlSelect,
    array('extra2' => 'Barkas') // could be $_GET, $_POST or something else
));

我想你必须在这里和那里添加一些错误检查。

答案 2 :(得分:0)

不要以该字符串开头。在连接到字符串之前处理您拥有的数据。

最有可能的是,在处理数据之后,您不需要创建一个巨大的字符串。你不能运行循环并回显HTML,需要输入变量吗?

答案 3 :(得分:0)

如果你确定$ option结构,你可以这样做:

function makeSelect($name, $options) {
    if (is_string($options)) {
        preg_match('/<select name="(.+?)"/', $options, $match);
        $name = $match[1];
        ...

您还可以构建$ options以包含以这种方式选择的名称:

$options = array(
    'name'   => 'The name',
    'options => ...
);