搜索并替换PHP中给定模式内的字符串

如何解决搜索并替换PHP中给定模式内的字符串

我正在尝试从给定的字符串模式生成html,类似于插件。 有三种模式,一个 no arg,一个 arg和一个 multi arg字符串模式。我无法更改此模式,因为它来自CMS。

{pluginName} or {pluginName=3} or {pluginName id=3|view=simple|arg999=asv}

一个例子:

<p>Hi this is a html page</p> 
<p>The following line should generate html</p>
{pluginName=3}
<p>The following line also should generate html</p>
{pluginName id=3|view=simple|arg999=asv}

我的目标是用某些东西替换那些“标签”(对于每个问题来说,处理这个问题并不重要)。但是我希望能够将给出的args传递给应该处理该逻辑的类/函数。

这是我的第一次尝试,不使用正则表达式,因为我不知道如何使用正则表达式(主要是因为它们速度较慢)。

<?php
function processPlugins($text,$pos = 0,$start = '{',$end = '}') {
    $plugins = array('plugin1','plugin2');
    while(($pos = strpos($text,$start,$pos)) !== false) {
        $startPos = $pos;
        $pos += strlen($start);
        foreach($plugins as $plugin) {
            if(substr($text,$pos,strlen($plugin)) === $plugin
               && ($endPos = strpos($text,$end,$pos + strlen($plugin))) !== false) {
                $char = substr($text,$pos + strlen($plugin),1); // 1 is strlen of (= or ' ')
                $pos += strlen($plugin) + 1; // 1 is strlen of (= or ' ')
                $argString = substr($text,$endPos - $pos);
                if($char === ' ') { //Multi arg
                    $params = explode('|',trim($argString));
                    $paramDict = array();
                    foreach ($params as $param) {
                        list($k,$v) = array_pad(explode('=',$param),2,null);
                        $paramDict[$k] = $v;
                    }
                    //$output = $plugin->processDictionary($paramDict);
                    var_dump($paramDict);
                } elseif ($char === '=') { //One arg
                    //$output = $plugin->processArg($argString); 
                    echo $argString . "\n";
                } elseif ($char === $end) { //No arg
                    //$output = $plugin->processNoArg();
                    echo $plugin. "\n";
                }
                $pos = $endPos + strlen($end);
                break;
            }
        }
    }
}

processPlugins('{plugin1}');
processPlugins('{plugin2=3}');
processPlugins('{plugin2 arg1=b|arg2=d}');

以前的代码可在PHP沙箱中使用。

该代码似乎可以正常工作(暂时),但是似乎很粗略。您会以不同的方式处理这个问题吗?我可以以某种方式重构此代码吗?

解决方法

如果您选择使用基于正则表达式的字符串操作功能,为什么不使用const isReq = (string) => { const matched = string.match(/^<(.+)>$/); return matched ? matched[1] : false; }; if (command.args) { var everythingAccountedFor = false; const options = command.args.split(' | '); for (const option of options) { const [definer,...values] = option.split(' '); if (definer !== args[0]) continue; if ( values.some((word,index) => isReq(word) && args[index + 1] !== isReq(word)) ) break; everythingAccountedFor = true; break; } if (!everythingAccountedFor) return message.channel.send( `You're message did not provide a required argument.\nHere is the command structure: \`${command.args}\`` ); } 将输入分解为有效部分呢?

这是另一种实现方式:

explode

当然,回声线可能会被丢弃。将它们放置到位后,我们得到以下输出:

function processPlugins($text,$pos = 0,$start = '{',$end = '}') {
  
  $t = substr($text,$pos);
  if($pos > 0) {
    echo "$pos chracters removed from the begining: $t" . PHP_EOL;
  } else {
    echo "Starting with '$t'" . PHP_EOL;
  }
  
  $parts = explode($start,$t);
  $t = $parts[1];
  
  $parts = explode($end,$t);
  $t = $parts[0];

  echo "The part between curly braces: '$t'" . PHP_EOL;
  
  $t = str_replace(['plugin1','plugin2'],'',$t);
  
  echo "After plugin name has been removed: '$t'" . PHP_EOL;
  
  $n = strlen($t);  
  if(!$n) {
    echo "Processing complete: " . trim($parts[0]) . PHP_EOL . PHP_EOL;
    return;
  }
  
  $params = explode('|',$t);
  echo 'Key-Values: ' . json_encode($params) . PHP_EOL;
  
  
  $kv = [];
  foreach($params as $p) {
    list($k,$v) = explode('=',trim($p));
    echo "    Item: '$p',Key: '$k',Value: '$v'" . PHP_EOL;
    
    if($k === '') {
      echo "Processing complete: $v" . PHP_EOL . PHP_EOL;
      return;
    }
    
    $kv[$k] = $v;
    
  }
  
  echo "Processing complete: " . json_encode($kv) . PHP_EOL . PHP_EOL;  
  
}

echo '<pre>';
processPlugins('{plugin1}');
processPlugins('{plugin2=3}');
processPlugins('{plugin2 arg1=b|arg2=d}');
,

此版本适用于具有多个插件令牌的输入。

function processPlugins($text,$end = '}') {
  $processed = [];
  $t = substr($text,$pos);
  $parts = explode($start,$t);
  array_shift($parts);
  foreach($parts as $part) {
    $pparts = explode($end,$part);
    $t = trim($pparts[0]);
    $t = str_replace(['plugin1',$t);
    $n = strlen($t);
    if(!$n) {
      $processed[] = trim($pparts[0]);
      continue;
    }
    $params = explode('|',$t);
    $kv = [];
    foreach($params as $p) {
      list($k,trim($p));
      if(trim($k) === '') {
        $processed[] = trim($v);
        continue 2;
      }
      $kv[trim($k)] = trim($v);
    }
    $processed[] = $kv;  
  }
  return $processed;
}

function test($case) {
  $p = processPlugins($case);
  echo "$case => " . json_encode($p) . PHP_EOL;
}

$cases = [
  '{plugin1}','{plugin2=3}','{plugin2 arg1=b|arg2=d}','text here {plugin1} and more{plugin2=55}here {plugin2 arg1=b|arg2=d} till the end'
];
foreach($cases as $case) {
  test($case);
}

输出:

{plugin1} => ["plugin1"]
{plugin2=3} => ["3"]
{plugin2 arg1=b|arg2=d} => [{"arg1":"b","arg2":"d"}]
text here {plugin1} and more{plugin2=55}here {plugin2 arg1=b|arg2=d} till the end => ["plugin1","55",{"arg1":"b","arg2":"d"}]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-