php - 用正则表达式动态替换条件块的一部分
问题描述
格式中有一个字符串:
else if($rule=='somerule1')
echo '{"s":1,"n":"name surname"}';
else if($rule=='somerule2')
echo '{"s":1,"n":"another text here"}';
...
"s"
只能有数字,"n"
任何文本。
在输入中我有$rule
值,我需要删除与else if
该值对应的块。我正在尝试这个:
$str = preg_replace("/else if\(\$rule=='$rule'\)\necho '{\"s\":[0-9],\"n\":\".*\"/", "", $str);
where$str
是一个包含我上面提到的块的字符串,$rule
是一个带有我需要删除的规则的字符串。但是函数返回$str
没有变化。
我做错了什么?
例如,将"s"
值更改为 1 的脚本效果很好:
$str = preg_replace("/$rule'\)\necho '{\"s\":[0-9]/", $rule."')\necho '{\"s\":1", $str);
所以,很可能,我在=
符号、空间或.*
.
解决方案
正则表达式模式可以不那么严格,简单得多,并且更容易阅读/维护。
您需要将第一行(条件表达式)与唯一的动态组件进行逐字匹配$rule
,然后匹配紧随其后的整行。
代码:(演示)
$contents = <<<'TEXT'
else if($rule=='somerule1')
echo '{"s":1,"n":"name surname"}';
else if($rule=='somerule2')
echo '{"s":1,"n":"another text here"}';
TEXT;
$rule = "somerule1";
echo preg_replace("~\Qelse if(\$rule=='$rule')\E\R.+~", "", $contents);
输出:
else if($rule=='somerule2')
echo '{"s":1,"n":"another text here"}';
那么,我做了什么?这是官方模式演示。
\Q
...\E
表示“从字面上处理这两个元字符之间的所有内容”- 那么唯一需要转义的字符是第一个
$
,这并不是要阻止它被解释为字符串结尾的元字符,而是作为$rule
变量的开头,因为模式用双引号括起来。 - 模式中第二次出现的
$rule
确实需要被解释为变量,因此它不会被转义。 - 是
\R
一个元字符,表示\n、\r 和 \r\n .
最后用一个或多个量词 ( )匹配所有下一行与“任何字符”+
。
推荐阅读
- javascript - 模态窗口删除错误数据
- python-3.x - 如何将 python 字典数据插入谷歌云 bigquery
- excel - 将数据复制到临时表,跳过列
- android-studio - android布局动画从下到上
- sql - 将具有不同键的字典保存到 SQL
- vue.js - Vue 2:获取访问“/api/api/X”而不是“/api/X”?
- html - 如何选择特定元素的子元素,而不必一次又一次地键入父元素的名称?
- r - 为什么当将列表传递给 measure.vars 时,melt 会产生警告?
- forms - Symfony 渲染一个集合表单类型原型
- javascript - 在 Next.js 中获取表单提交数据的最佳方法是什么?