0

mailto リンクを自動的に作成して正しくエンコードする php ツールを作成しています。

一般的なテキストでは正しく動作していますが、HTML メール テンプレート クリエーター プログラムによって取得されるカスタム区切り文字の間にコードを含める必要があります。

プログラムの区切り文字は <% %> です。

これが私の現在のコードです:

$link = "mailto:unsubscribe@example.com?&subject=Unsubscribe&body=<% 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 に答える