PHP preg_replace-在匹配的情况下,通过一次调用删除部分由正则表达式匹配的字符串的开头和结尾?
在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"
$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中的正则表达式字符串中显示一个文字反斜杠,必须使用四个反斜杠。(反斜杠对于字符串和正则表达式引擎分别转义一次,因为反斜杠是一个特殊字符。)似乎使用单引号可以在正则表达式中使用更少的反斜杠:。以防您对正则表达式的工作方式感兴趣。谢谢!我将更仔细地了解团队。