Php替换字符串除了分隔符之外

时间:2013-06-29 16:04:43

标签: php replace delimiter mailto

我正在制作一个php工具来自动创建和正确编码mailto链接。

我已经使它适用于一般文本,但我需要能够在HTML电子邮件模板创建程序选择的自定义分隔符之间包含代码。

节目分隔符为< %%>。

这是我目前的代码:

  

$ link =“mailto:unsubscribe@example.com?& subject =取消订阅& body =亲爱的<%User.Name%> \ r \ n请将您从邮件列表中删除。\ r \ n注:< ;%Customer.Ref%>“;   $ link = str_replace(“”,“%20”,$ link);
  $ link = str_replace(“\ r \ n”,“%0A”,$ link);

目前它会转换分隔符中的空格,我怎么能阻止它这样做呢?

1 个答案:

答案 0 :(得分:0)

也许,不是最优雅的解决方案,但它确实有效。我正在用分隔符拆分你的字符串,并使用一个简单的确定性有限状态机来替换分隔符之外的字符串。

<?php
$link = "Dear <% User N a m e %>Please remove me";

function escape_outside_delimiters(&$string)
// {{{
{
    $output = "";
    //splitting the string by either <% or %>, keeping the delimiters
    $matches = preg_split("/(:?<%|%>)/", 
                         $string,
                         -1, 
                         PREG_SPLIT_DELIM_CAPTURE);

    //replacing everything outside delimiters, 
    //putting the escaped chunks to $output
    $n = count($matches);
    $flag = 0;
    for ($i = 0; $i < $n; ++$i)
    {
        switch ($matches[$i]){
        case "<%":
            $flag = 1;
            break;
        case "%>":
            $flag = 0;
            break;
        default:
            if ($flag == 0)
            {
                $matches[$i] = str_replace(" ", "%20", $matches[$i]);
            }
        }
        $output .= $matches[$i];
    }

    return $output;
}
// }}}


$link = escape_outside_delimiters($link);
print $link;

打印:

Dear%20<% User N a m e %>Please%20remove%20me