php中的preg_match_all和preg_replace

时间:2016-11-02 00:55:49

标签: php regex preg-replace preg-match-all

我有一个大的xml文件(大约2mb),需要用我的附加字符串=&gt;替换所有复选框和广播。 <i></i>

例如

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

它有效,但有时会被多个&#34; I&#34;标签

例如

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

我的正则表达式错了?或者是其他东西? 如何只对字符串进行一次替换?

此处截图 image

1 个答案:

答案 0 :(得分:0)

没有必要迭代匹配。您只需使用一个preg_replace即可完成所有操作。

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

它匹配任何复选框或广播输入标记,并将该匹配替换为$0<i></i>,其中$0指的是整个匹配。