首页 > 编程语言 >PHP7 preg_replace 出错及解决办法

PHP7 preg_replace 出错及解决办法

时间:2023-02-05 17:00:43浏览次数:42  
标签:callback url preg replace matches str PHP7

问题描述:

PHP7废弃了preg_replace?

原本是中php5中处理url中后面参数替换清除的,代码如下


$url = preg_replace('/([?&])src=[^&]+(&?)/e', '"$2"==""?"":"$1"', $url);

但是到php7中就报错了

需要用preg_replace_callback来替换,请问该咋办?

相关代码


$url = preg_replace('/([?&])src=[^&]+(&?)/e', '"$2"==""?"":"$1"', $url);

问题分析:

e 修饰符因为存在安全隐患 自 5.3 开始就已经标记为了待移除的内容。

转而接替的是 preg_replace_callback,此方法第二个参数为一个回调函数,回调函数会自动传入比配的分组作为参数。在回调函数内部通过数组下标访问匹配组。(手机码字 未格式化代码)


preg_replace_callback('/([?&])src=[^&]+(&?)/', function($matches){
    return $matches[2]==""?"":$matches[1];
}, $url);

知识点扩展:

PHP7已经删除了preg_replace的e修饰符

官网提示是这样的,对/e修饰符的支持已删除。请改用preg_replace_callback()

原因是/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后),会被一句话后门使用

看看smarty中是也是这样用的,也是存在问题


$source_content = preg_replace($search.'e', "'"
. $this->_quote_replace($this->left_delimiter) . 'php'
. "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
. $this->_quote_replace($this->right_delimiter)
. "'"
, $source_content);
可以把smarty模板修改成这个
$source_content = preg_replace_callback($search, function ($matches){
$str="";
$str.=$this->_quote_replace($this->left_delimiter) . 'php';
$str.=str_repeat("\\n\\", substr_count($matches[1], "\\n\\"));
$str.=$this->_quote_replace($this->right_delimiter);
return $str;
}, $source_content);

标签:callback,url,preg,replace,matches,str,PHP7
From: https://www.cnblogs.com/dituirenwu/p/17093593.html

相关文章

  • CF1707E Replace
    CF1707EReplace完全没想到从这种角度考虑性质。一开始的思路是把每种区间表示为一个节点建树,然后答案就是深度,但是很显然节点数是平方级别的,所以就寄了。尝试使用数据结......
  • 题解 【[USACO23JAN] Find and Replace G】
    problem有一个字符串\(S\),初始时为\(\tt'a'\),现在进行\(n\)次操作,第\(i\)次操作形如:将\(S\)中的所有的字符\(ch_i\)替换为字符串\(T_i\)。然后输出\(S[l......
  • ReplaceGoogleCDN扩展功能使用二:拦截请求域名
    文档说明:只记录关键地方;2023-01-29使用例子:例子:拦截访问域名https://www.jingjingxyk.com更多玩法,可配合content_scripts实现清除内容农场规则例子[{......
  • ReplaceGoogleCDN扩展功能使用一: 修改UserAgent
    文档说明:只记录关键地方;2023-01-29目的:因为屏幕小,移动端使用神马搜索太不方便了,想在PC端使用神马搜索实验:通过chromedev-tools控制台调试发现,把UserAgent修改为移......
  • ReplaceGoogleCDN扩展下载和安装
    ReplaceGoogleCDN扩展下载和安装文档说明:只记录关键地方;2023-01-29在线安装备注:扩展市场的代码版本远落后于源码仓库版本ChromeFirefoxEdge手动安装:Chrome......
  • mysql与lightdb中的insert on duplicate/replace
    最近看pg中insert的实现源码,看到onconflict的excluded优点疑惑,顺带总结下mysql和pg中已存在更新、不存在插入的差异(注:oracle是mergeinto实现)。在mysql中的insertondup......
  • php7.1 配置,CentOS7.5安装PHP7.1
    #添加rpm-Uvhhttps://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmrpm-Uvhhttps://mirror.webtatic.com/yum/el7/webtatic-release.rpm#查看......
  • Stata:replace
    replacexm=substr(xm,1,3)+strofreal(_n)//以每个记录xm观测值的第一个字符和行号的组合替换当前的xm的观测值,substr(xm,1,3)截取第一个汉字,strofreal(_n)将行号转为字符......
  • Mysql,replace into,存在则更新,不存在则插入
    REPLACEINTO首先判断数据是否存在;如果不存在,则插入;如果已存在则更新(先删除再插入) 注意:根据主键或唯一索引判断记录是否已存在,所以插入数据的表必须要有主键或者唯......
  • c++ std string replaceAll函数
    std提供的string的replace方法,不太方便stringreplaceAll(string&str,stringoldStr,stringnewStr){string::size_typepos=str.find(oldStr);while(pos......