Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Найти и заменить значения value


Автор: garden 16.11.2007, 12:31
Добрый день.

Задача
Найти и заменить значения полей по имени поля

Пример
Есть массив значений: name1->value1, name2->value2, name3->value3 и т.д.

Необходимо заменить код:
Цитата

<input type="text" name="name1" value="">
<select name="name2"><option value="value2"><option value="value"></select>
<textarea name="name3"></textarea>


На следующий:
Цитата

<input type="text" name="name1" value="value1">
<select name="name2"><option value="value2" checked><option value="value"></select>
<textarea name="name3">value3</textarea>


Иными словами:
- необходимо найти значение поля с именем text и вставить требуемый текст в value
- необходимо найти значение выпадающего списка с именем name2 и пометить option с именем value2 как выбраным (selected)
- необходимо найти textarea поле с именем name3 и вставить значение value3

Буду очень благодарен за помощь.

Автор: mishaSL 16.11.2007, 13:44
Вот набросал код:
Код

<?php
$Arr = array('name1'=>'value1', 'name2'=>'value2', 'name3'=>'value3');

$text = <<<TEXT
<input type="text" name="name1" value="">
<select name="name2"><option value="value2"><option value="value"></select>
<textarea name="name3"></textarea>
TEXT;
print "<pre>До замены:\n".$text."</pre>";
$m = array();
if (preg_match_all('#<(input|select|textarea)[^>]+name=[\'|"]?([a-z0-9-_]*)[\'|"]?#is', $text, $m) != 0) {
    //print_r($m);
    foreach($m[2] as $k=>$v) {
        if (array_key_exists($v, $Arr)) {
            switch($m[1][$k]) {
                case 'input':
                    $pattern = '#(<input[^>]+name=[\'|"]?'.preg_quote($v).'[\'|"]?[^>]+value=[\'|"]?)(.*?)([\'|"]?)#is';
                    $replace = '$1'.$Arr[$v].'$3';
                    break;
                case 'select':
                    $pattern = '#(<select[^>]+name=[\'|"]?'.preg_quote($v).'[\'|"]?[^>]*?>.*?<option[^>]+value=[\'|"]?'.preg_quote($Arr[$v]).'[\'|"]?)([^>]*?)(>.*?</select>)#is';
                    $replace = '$1 selected$3';
                    break;
                case 'textarea':
                    $pattern = '#(<textarea[^>]+name=[\'|"]?'.preg_quote($v).'[\'|"]?[^>]*>)(.*?)</textarea>#is';
                    $replace = '$1'.$Arr[$v].'</textarea>';
                    break;
                }
            $text = preg_replace($pattern, $replace, $text);
        }
    }
}

print "<pre>После замены:\n".$text."</pre>";

?>


Добавлено через 56 секунд
Сделал так, чтобы дополнить его была не проблема smile 

Автор: garden 16.11.2007, 23:19
Спасибо огромное, все прекрасно работает.
P.S. Отблагодарить материально не могу, к сожелению, но могу подарить немного хостинга.smile

Добавлено через 9 минут и 49 секунд
Прошу прощения, немного перепутал. В полях select необходимо найти значение value2 и выделить его selected

Исходный код:
Цитата

<select name="select"><option value="0">value1</option><option value="1">value2</option></select>


Должно получиться:
Цитата

<select name="select"><option value="0">value1</option><option value="1" selected>value2</option></select>

Автор: mishaSL 19.11.2007, 10:52
Цитата(garden @  16.11.2007,  23:19 Найти цитируемый пост)
Прошу прощения, немного перепутал. В полях select необходимо найти значение value2 и выделить его selected

Для этого просто необходимо изменить массив $Arr ('имя поля'->'значение')
Добавьте еще один элемент массива:
Код

$Arr['select'] = '1';



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)