php preg_replace忽略内容中的$ n

时间:2011-10-29 21:16:13

标签: php preg-replace

我目前的正则表达式为/[$]([a-zA-Z0-9_\-\,:]*)[$]/,这样我就可以为CMS替换以下字符串:

$ContentArea1$
$blog:PostTitle$

然而,当我们的内容以美元preg_replace的价格摆脱价格的第一部分时,例如$15 $1 $2 etc

如何让preg_replace忽略内容中的价格?

    <?

    $message = 'Below is an example for the content replacement<br/><br/><br/>$ContentArea1$';

    $newMessage = '<h2>Website Coming soon</h2>
<p>
    Are new website will be online soon.</p>
<p>
    Price: $2.50</p>
<h2>
    Twitter Feed</h2>
';





    echo preg_replace('/[$]ContentArea1[$]/',$newMessage,$message);

?>

4 个答案:

答案 0 :(得分:0)

您可以将正则表达式扩展为包含$后跟数字,以便价格值中的$不会终止:

/[$]((?:[a-zA-Z0-9_\-\,:]*)(?:[$]\d)?)+[$]/

答案 1 :(得分:0)

我不确定,如果我理解你的问题,但我有三种可能的解决方案:

  1. 更改正则表达式,使其仅匹配不以数字开头的变量:

    [$]([a-zA-Z_\-\,:][a-zA-Z0-9_\-\,:]*)[$]

  2. 将其更改为仅匹配包含冒号的变量:

    [$]([a-zA-Z0-9_\-\,]*:[a-zA-Z0-9_\-\,]*)[$]

  3. 您还可以使用函数preg_replace_callback/e修饰符来调用仅替换有效变量名称的自定义PHP函数。

答案 2 :(得分:0)

我已经找到了如何允许$ 1.99显示在替换$ ContentArea1 $或我使用以下函数的任何其他变量的内容中。

function preg_replacement_quote($str) {
    return preg_replace('/(\$|\\\\)(?=\d)/', '\\\\\1', $str);
}

$input = '$5 dollars';
$replacement = '$10+$5';
var_dump(preg_replace('|^(.*) dollars$|', preg_replacement_quote($replacement) . ' dollars', $input));
//  output: string(14) "$10+$5 dollars"

现在允许我在内容中显示$符号。

来源:http://www.procata.com/blog/archives/2005/11/13/two-preg_replace-escaping-gotchas/

感谢您的所有答案和评论

答案 3 :(得分:0)

感谢您发布问题的基本示例,现在很清楚您的问题是什么:)

另一个简单的解决方案是使用str_replace代替preg_replace

str_replace('$ContentArea1$', $newMessage, $message);