0

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

我已经让它对一般文本正常工作,但我需要能够在自定义分隔符之间包含代码,这些代码将由 HTML 电子邮件模板创建程序获取。

程序分隔符是 <% %>。

这是我当前的代码:

$link = "mailto:unsubscribe@example.com?&subject=Unsubscribe&body=Dear <% User.Name %>\r\n请将我从你的邮件列表中删除。\r\nRef: <% Customer.Ref %>";
$link = str_replace(" ", "%20", $link);
$link = str_replace("\r\n", "%0A", $link);

目前它将转换分隔符内的空格,我该如何阻止它这样做?

4

1 回答 1

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
于 2013-06-29T17:25:51.210 回答