【问题标题】:How to get preg_replace() to delete text between two tags?如何让 preg_replace() 删除两个标签之间的文本?
【发布时间】:2014-11-07 19:07:04
【问题描述】:

我正在尝试在 PHP 中创建一个函数,该函数可以从一个文件夹及其所有子文件夹中的所有 .js 文件中删除两个标签中的代码。到目前为止,除了preg_replace(),一切正常。这是我的代码:

<?php

deleteRealtimeTester('test');

function deleteRealtimeTester($folder_path)
{
    foreach (glob($folder_path . '/*.js') as $file) 
    {
        $string = file_get_contents($file); 

        $string = preg_replace('#//RealtimeTesterStart(.*?)//RealtimeTesterEnd#', 'test2', $string);

        $file_open = fopen($file, 'wb');
        fwrite($file_open, $string);
        fclose($file_open);
    }

    $subfolders = array_filter(glob($folder_path . '/*'), 'is_dir');

    if (sizeof($subfolders) > 0)
    {
        for ($i = 0; $i < sizeof($subfolders); $i++)
        {
            echo $subfolders[$i];
            deleteRealtimeTester($subfolders[$i]);
        }
    }
    else
    {
        return;
    }
}

?>

如前所述,我想删除这些标签中的所有内容以及标签本身:

//RealtimeTesterStart

//RealtimeTesterEnd

标签包含正斜杠很重要,而且如果文件包含多个这些标签,则仅删除从 //RealtimeTesterStart//RealtimeTesterEnd 的代码,而不是从 //RealtimeTesterEnd//RealtimeTesterStart 的代码。

我希望有人可以帮助我。

【问题讨论】:

    标签: php tags preg-replace


    【解决方案1】:

    您还可以更改正则表达式以使用 [\s\S] 字符集,该字符集可用于匹配任何字符,包括换行符。

    所以有以下

    preg_replace('#\/\/RealtimeTesterStart[\s\S]+\/\/RealtimeTesterEnd#', '', $string);
    

    这将删除 //RealtimeTesterStart 到 //RealtimeTesterEnd 的内容以及标签本身。

    【讨论】:

      【解决方案2】:

      我假设//RealtimeTesterStart//RealtimeTesterEnd 和它们之间的代码在不同的行上?在 PCRE 中 . 不匹配换行符。您需要使用s 修饰符(并且不需要(),除非您需要捕获的文本进行替换):

      #//RealtimeTesterStart.*?//RealtimeTesterEnd#s
      

      另外,请查看 GLOB_ONLYDIR 中的 glob 而不是 array_filter。另外,也可能是file_put_contents 而不是fopen 等。

      可能是这样的:

      foreach (glob($folder_path . '/*.js') as $file) {
          $string = file_get_contents($file);
          $string = preg_replace('#//RealtimeTesterStart.*?//RealtimeTesterEnd#s', 'test2', $string);
          file_put_contents($file, $string);
      }
      
      foreach(glob($folder_path . '/*', GLOB_ONLYDIR) as $subfolder) {
          deleteRealtimeTester($subfolder);
      }
      

      【讨论】:

      • 非常感谢它的工作?...好吧,我会调查的 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多