PHP preg_replace-在匹配的情况下,通过一次调用删除部分由正则表达式匹配的字符串的开头和结尾?

PHP preg_replace-在匹配的情况下,通过一次调用删除部分由正则表达式匹配的字符串的开头和结尾?,php,regex,preg-replace,preg-match,Php,Regex,Preg Replace,Preg Match,在PHP中,我尝试实现以下目标(如果可能,仅使用preg_replace函数): 示例: $example1 = "\\\\\\\\\\GLS\\\\\\\\\\lorem ipsum dolor: T12////GLS////"; $example2 = "\\\\\\GLS\\\\\\hakunamatata ::: T11////GLS//"; $result = preg_replace("/(\\)*GLS(\\)*(.)*(\/)*GLS(\/)*/", "REPLACEMENT"

在PHP中,我尝试实现以下目标(如果可能,仅使用preg_replace函数):

示例:

$example1 = "\\\\\\\\\\GLS\\\\\\\\\\lorem ipsum dolor: T12////GLS////";
$example2 = "\\\\\\GLS\\\\\\hakunamatata ::: T11////GLS//";

$result = preg_replace("/(\\)*GLS(\\)*(.)*(\/)*GLS(\/)*/", "REPLACEMENT", $example1);

// current $result: REPLACEMENT (that means the regex works, but how to replace this?)

// desired $result
// for $example1: lorem ipsum dolor: T12
// for $example2: hakunamatata ::: T11
我当然咨询过,但我的替换实验还没有成功

使用一个preg_替换是否可以实现这一点,还是必须拆分正则表达式并分别替换前面的匹配项和后面的匹配项


如果正则表达式完全不匹配,我希望收到一个错误,但我可以先用preg_match来说明。

主要的一点是用一个捕获组匹配并捕获您需要的内容,然后用该组的反向引用替换。在正则表达式中,您对组(
(.)*
)应用了一个量词,因此您失去了对整个子字符串的访问,只有最后一个字符保存在该组中

请注意,
(.)*
(.*)
匹配的字符串相同,但在前一种情况下,当正则表达式引擎抓取一个字符并将其保存在缓冲区中时,捕获组中将有1个字符,然后抓取另一个字符并重新写入前一个字符,依此类推。使用
(.*)
表达式,所有字符都会集中在一个块中,并作为一个完整的子串保存到缓冲区中

以下是一种可能的方法:

$re = "/\\\\*GLS\\\\*([^\\/]+)\\/+GLS\\/+/"; 
// Or to use fewer escapes, use other delimiters
// $re = "~\\\\*GLS\\\\*([^/]+)/+GLS/+~"; 
$str = "\\\\\\GLS\\\\\\hakunamatata ::: T11////GLS//"; 
$result = preg_replace($re, "$1", $str);
echo $result;

结果:
hakunamatata:::T11

若要在php中的正则表达式字符串中显示一个文字反斜杠,必须使用四个反斜杠。(反斜杠对于字符串和正则表达式引擎分别转义一次,因为反斜杠是一个特殊字符。)似乎使用单引号可以在正则表达式中使用更少的反斜杠:。以防您对正则表达式的工作方式感兴趣。谢谢!我将更仔细地了解团队。