我正在尝试用正则表达式替换字符串中找到的匹配项,但它并不能完全满足我的需要。
查看线路[STRING_****] (STRING_*****) /STRING
有必要替换除 /STRING 之外的所有 STRING,同时由于某种原因也为我替换了括号。
$file = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/uploads/data.txt');
$searchContext = 'STRING';
$replaceContext = 'NEW_STRING';
$pattern = '/([\[(\s])('.$searchContext.')/';
$result = preg_replace($pattern, $replaceContext, $file);
原始正则表达式有 2 个捕获组(子模式),每个捕获组创建一个内存缓冲区来存储部分匹配项:
这两组的内容可以“恢复”,即 使用反引号引用这些组中的文本,可以使用以下语法在替换模式中使用反引号:
$
+идентификатор группы
。Group #1 是第一对未转义括号括起来的模式,在替换模式中,使用$1
:查看PHP 演示
从上面可以看出,第二个捕获组是多余的。
还有另一种方法。捕获组被赋予一个已知长度的模式(
([\[(\s])
找到一个字符),因此可以简单地将组转换为向后预览块并使用另一个演示
预览块不会将找到的文本添加到最终的值数组中,也不会更改行中的位置(即,检查这些块的模板是否存在,并且在退出块时,搜索后续templates 从开始搜索块模板的行中的相同位置继续)。
在 PCRE 中,除了描述的两种方法外,您还可以使用“重置匹配”运算符
\K
:并再次演示
之前找到的任何内容都会
\K
从匹配缓冲区中删除。注意:如果您
$searchContext
需要特殊的元字符(运算符,例如(
,)
,[
,{
,\
,+
,^
,$
,和)*
,您必须使用. 第二个参数转义正则表达式分隔符(在本例中为)。?
.
preg_quote($searchContext, '/')
/