regex preg_replace(),其中匹配项后跟以数字开头的字符串

biswetbf  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(132)

我正在尝试将href属性的内容替换为其他URL
所以我用这个脚本

$html = 'data-content="111"';
$var_2 = "222";
$html = preg_replace('/(["\'])111\1/i',"$1$var_2$1",$html);
echo $html

输出为

data-content=22"

我所期待的

data-content="222"

问题是编译器查找匹配$12,因为$var_2以数字“2”开头
我试着像这样编辑代码,但没有成功

$html = preg_replace('/(["\'])111\1/i','$1'.$var_2.'$1',$html);
vc9ivgsu

vc9ivgsu1#

您可以通过对替换组使用2位数字(在本例中为01)来解决此问题:

$html = 'data-content="111"';
$var_2 = "222";
$html = preg_replace('/(["\'])111\1/', "$01$var_2$1",$html);
echo $html;

输出:

data-content="222"

Demo on 3v4l.org
您也可以使用preg_replacemanual页面中介绍的方法解决此问题:
当使用反向引用后面紧跟另一个数字的替换模式时(即:在匹配的模式之后立即放置文字数字),则不能使用熟悉的\1表示法进行反向引用。例如,\11会混淆preg_replace(),因为它不知道您是否希望\1反向引用后面跟随文字1,或者后面不跟任何内容的\11反向引用。在这种情况下,解决方案是使用${1} 1。这将创建一个隔离的$1反向引用,并将1保留为文本。

$html = preg_replace('/(["\'])111\1/', '${1}' . "$var_2$1",$html);

注意在这个例子中${1}必须用单引号括起来,以防止PHP试图用变量$1的值来替换它。还要注意对于示例数据来说,i(不区分大小写)标志是不需要的,我已经删除了它。
Demo on 3v4l.org

相关问题