使用preg_replace的PHP问题

时间:2017-02-17 20:48:40

标签: php regex

您好我在PHP中有以下代码:

        $str1 = "A charge of
<b>$3.03</b>
including fees of
<b>$1.03</b>
and
<b>$1.00</b>
on 02/17/2017";

        $message = '<p><b>Your payment will be scheduled as below:</b></p><p id=\'firstPaymentCC\'>A charge of <b id=\'firstPaymentCCB\'>$2.03</b> including a fee of <b>$1.03</b> on 02/17/2017</p><p>A charge of <b id=\'firstPaymentCCB\'>$2.03</b> including a fee of <b>$1.03</b> on 02/24/2017</p><p>A charge of <b id=\'firstPaymentCCB\'>$2.03</b> including a fee of <b>$1.03</b> on 03/03/2017</p><p>A charge of <b id=\'firstPaymentCCB\'>$2.03</b> including a fee of <b>$1.03</b> on 03/10/2017</p>';

        echo preg_replace("/<p id='firstPaymentCC'>[\s\S]+?<\/p>/", $str1, $message);

我想要做的是在变量<p id='firstPaymentCC'> and </p>中的2个分隔符$message之间提取文本,并将其替换为变量$str1的内容。

我得到的结果是:您的付款方式如下: 收费.03,包括2017年2月17日的.03和.00费用

2017年2月24日收取2.03美元的费用,包括1.03美元的费用

2017年3月3日收取2.03美元的费用,包括1.03美元的费用

2017年10月3日收取2.03美元的费用,包括1.03美元的费用

为什么有.03和.00,而它应该是1.03美元和1.00美元?

感谢。

2 个答案:

答案 0 :(得分:1)

$str1包含替换模式

在替换模式中,$ +数字定义反向引用

如果您不想定义反向引用,请转义美元符号:

$str1 = "A charge of
<b>\\\$3.03</b>
including fees of
<b>\\\$1.03</b>
and
<b>\\\$1.00</b>
on 02/17/2017";

注意:由于字符串是用双引号字符串文字定义的,要定义$符号,需要对其进行转义("\$"),并定义一个文字反斜杠(将逃避文字美元符号)需要两个反斜杠("\\")。详细了解PHP string literals here

答案 1 :(得分:-1)

$引用模式中使用的括号对的匹配内容 - $ 1匹配第一组,$ 2匹配第二组等。

你可以像这样使用它:

echo preg_replace('/([0-9]+):([0-9]+)/','$1 hours and $2 mins','12:23');

这将输出:12 hours and 23 mins

如果您只想用实际的美元符号替换 - 您必须使用斜杠进行转义:

$str1 = "A charge of
<b>\\$3.03</b>
including fees of
<b>\\$1.03</b>
and
<b>\\$1.00</b>
on 02/17/2017";

请注意,您必须使用双斜杠。

这里有一些更有用的信息:http://www.regular-expressions.info/brackets.html