2016-11-02 3 views
0

У меня есть большой файл XML (около 2 Мб) и необходимо заменить все флажки и радио с моей дополнительной строкой =><i></i>preg_match_all и preg_replace в PHP

например

<input type="checkbox" /> 

заменить

<input type="checkbox" /><i></i> 

код:

$file = 'style.xml'; 
$c = file_get_contents($file); 
preg_match_all("#<input.*type=\"(checkbox|radio)\".+? />#i", $c, $m); 
if($m) 
{ 
     for($i = 0; $i < count($m[0]); $i++) 
     { 
      /*$search = trim($m[0][$i]); 
      $replace = "$search<i></i>";*/ 
      $c = preg_replace("#" . preg_quote($m[0][$i], "#") . "#i", $m[0][$i] . '<i></i>', $c); 

     } 
} 
    if($fp = @fopen('new-style.xml', 'w')) 
    { 
     @flock($fp, 2); 
     @fputs($fp, $c); 
     @flock($fp, 3); 
     @fclose($fp); 
    } 

это работает, но иногда заменяет более одного "I" тега

например

<input type="checkbox" /><i></i><i></i><i></i><i></i> 
<input type="radio" /><i></i><i></i><i></i> 

моего регулярным выражение является неправильным? или что-то другое? Как сделать замену только один раз для строки?

скриншот здесь image

+1

Использовать XML-парсер. –

+0

Некоторые из этих флажков/радиовходов присутствуют более одного раза? – RST

+0

Возможно, вы захотите рассмотреть [DOMDocument] (http://php.net/manual/en/class.domdocument.php). – PHPglue

ответ

0

Там нет необходимости перебирать матчей. Вы можете просто сделать все это с помощью одного preg_replace.

preg_replace("#<input.*type=\"(?:checkbox|radio)\".*? />#i", "$0<i></i>", $c);

Это соответствует любому флажок или радио ввода метки, и заменяет тот матч с $0<i></i>, где $0 относится ко всей игре.

+0

Спасибо Kayson! знак равно – krez

Смежные вопросы