也许,这不是最优雅的解决方案,但它确实有效。我通过分隔符拆分您的字符串,并使用一个简单的确定性有限状态机仅替换分隔符之外的字符串。
<?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