douliao5550 2016-11-02 00:55
浏览 38
已采纳

php中的preg_match_all和preg_replace

I have a large xml file (about 2mb) and need to replace all checkboxes and radio with my additional string => <i></i>

example

<input type="checkbox" />

replace with

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

the code is:

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

it works, but sometimes replaced with more than one "I" tag

example

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

my regex is wrong? or something else? how to make replacement only once for string?

screenshot here image

  • 写回答

1条回答 默认 最新

  • douying8666 2016-11-02 01:27
    关注

    There's no need to iterate over matches. You can just do it all with a single preg_replace.

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

    It matches any checkbox or radio input tag, and replaces that match with $0<i></i> where the $0 refers to the entire match.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)