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.

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

报告相同问题?

悬赏问题

  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)
  • ¥15 无法使用此凭据登录,因为你的域不可用,如何解决?(标签-Windows)
  • ¥15 yolov9的训练时间
  • ¥15 二叉树遍历没有报错但无法正常运行
  • ¥15 在linux系统下vscode运行robocup3d上场球员报错
  • ¥15 Python语言实验
  • ¥15 SAP HANA SQL 增加合计行
  • ¥20 用C#语言解决一个英文打字练习器,有偿
  • ¥15 srs-sip外部服务 webrtc支持H265格式
  • ¥15 在使用abaqus软件中,继承到assembly里的surfaces怎么使用python批量调动