我有一些包含多个HTML注释的HTML,每个注释中都有一个表单。我正在尝试使用preg_replace将这些注释和表单替换为[CONTACT_FORM_X]形式的标签,其中X是表单的数字ID。
$str = 'blah blah blah <!-- CONTACT FORM START [CONTACT_FORM_1] -->some form goes here<!-- CONTACT FORM END 1 --> blah blah blah <!-- CONTACT FORM START [CONTACT_FORM_2] -->another form goes here<!-- CONTACT FORM END 2 -->';
$replace = preg_replace('/<!-- CONTACT FORM START \[CONTACT_FORM_\d\] -->.*<!-- CONTACT FORM END \d -->/', '[CONTACT_FORM_X]', $str);
echo $replace;
所以:
<!-- CONTACT FORM START [CONTACT_FORM_1] -->some form goes here<!-- CONTACT FORM END 1 -->
应完全替换为[CONTACT_FORM_1]
而且..
<!-- CONTACT FORM START [CONTACT_FORM_2] --> another form goes here<!-- CONTACT FORM END 2 -->
应完全替换为[CONTACT_FORM_2]
如果我运行上面的代码,我会得到:
blah blah blah [CONTACT_FORM_X]
所以我的问题是:
如何获取\ d的值,然后使用它代替我在preg_replace中使用X的位置
我的代码似乎只替换其中一个表单而不是两个表单。如何调整preg_replace以允许多次替换
答案 0 :(得分:1)
preg_replace
将替换所有出现的事件(它是全局的)。 .*
虽然贪婪,但在<!-- CONTACT FORM START \[CONTACT_FORM_(\d)\]
到<!-- CONTACT FORM END \d -->
之后匹配所有内容。要使用()
来捕获值。
所以试试:
.*?<!-- CONTACT FORM START \[CONTACT_FORM_(\d)\] -->.*?<!-- CONTACT FORM END \d -->
或者如果你想确定你匹配相同的结束联系表格,请使用反向引用:
.*?<!-- CONTACT FORM START \[CONTACT_FORM_(\d)\] -->.*?<!-- CONTACT FORM END \1 -->
如果应保留前面的内容,则应删除前导.*?
。我不清楚这个意图是什么意思。从Should be replaced entirely with [CONTACT_FORM_2]
解释为我应该保留的唯一内容。
正则表达式演示:https://regex101.com/r/kS2nK6/1
PHP用法:
<?php
$str = 'blah blah blah <!-- CONTACT FORM START [CONTACT_FORM_1] -->some form goes here<!-- CONTACT FORM END 1 --> blah blah blah <!-- CONTACT FORM START [CONTACT_FORM_2] -->another form goes here<!-- CONTACT FORM END 2 -->';
$replace = preg_replace('/.*?<!-- CONTACT FORM START \[CONTACT_FORM_(\d)\] -->.*?<!-- CONTACT FORM END \d -->/', '[CONTACT_FORM_$1]', $str);
echo $replace;
PHP演示:https://eval.in/611232
答案 1 :(得分:1)
更改您的模式和替换字符串,如下所示:
$pattern = '/<!-- CONTACT FORM START \[CONTACT_FORM_(\d+)\] -->.*<!-- CONTACT FORM END \1 -->/';
$replace = preg_replace($pattern, '[CONTACT_FORM_$1]', $str);
工作原理
\d
更改为(\d+)
(+
只允许两位数+数字)\1
。将CONTACT FORM END \d
更改为CONTACT FORM END \1
告诉正则表达式引擎,只要您使用END
中显示的相同数字点击START
,就会停止要替换的字符串。如果没有这个,引擎会将所有内容替换为最后一个CONTACT FORM END
。这就是为什么你只得到一个替代品。$1
来引用第一个捕获的组。这就是为什么将CONTACT_FORM_X
更改为CONTACT_FORM_$1
会将正确的数字放在替换字符串中。