gpt4 book ai didi

delphi - 如何转义由 Delphi 生成的引号 PHP 字符串?

转载 作者:行者123 更新时间:2023-12-03 18:34:16 26 4
gpt4 key购买 nike

我的代码充斥着这样的东西

    Write  (thePhpFile, '    echo "<option value=\"' +
theControl.Name +
'_selection\">" . $' +
theControl.Name +
'_values[$_POST["' +
theControl.Name +
'_selection"]];');

生成以下 PHP 代码
 echo "<option value=\"ComboBox1_selection\">" . 
$ComboBox1_values[$_POST["ComboBox1_selection"]];?>

当然有更好的方法来处理这个问题吗?也许是一个 Delphi 函数,我可以传递所需的 PHP 字符串并在必要时将引号加倍?还是我在自欺欺人?

基本算法似乎是
// assume all PHP strings are double quoted, even when it's inefficient
find the first double quote, if any
find the last double quote, if any
for every double quote in between
change it to \""

听起来对吗?也许我应该自己编码?

嗯,没那么容易……在上面的片段中,我们不想逃避 $_POST["ComboBox1_selection"] - 最好只是手动编码顶部显示的困惑?

有任何想法吗?我现在要去谷歌“从 delphi 生成 php”——这可能是我几周前应该做的:-/

最佳答案

您不只是在生成 PHP。您正在生成 PHP,而 PHP 又会生成 HTML。您的程序需要了解两种语言的字符串编码规则。为此编写两个单独的函数可能会更容易:

function QuoteStringForPHP(s: string): string;
function QuoteHTMLAttributeValue(s: string): string;

鉴于你的例子,你会像这样使用它们:
ControlName := theControl.Name;
ValueName := ControlName + '_values';
SelectionName := ControlName + '_selection';
Write(thePhpFile, ' echo ' +
QuoteStringForPHP(
'<option value=' +
QuoteHTMLAttributeValue(SelectionName) +
'>'
) +
'.' +
'$' + ValueName + '[$_POST[' +
QuoteStringForPHP(SelectionName) +
']];'
);

编写它们很简单:
// Input: Any sequence of characters
// Output: A single-quoted PHP string literal
function QuoteStringForPHP(s: string): string;
begin
// Commented apostrophes are only to fix Stack Overflow's code highlighting
s := StringReplace(s, '\' {'}, '\\', [rfReplaceAll]);
s := StringReplace(s, '''', '\''' {'}, [rfReplaceAll]);
Result := '''' + s + '''';
end;

// Input: Any sequence of valid HTML text characters
// Precondition: s has not already had any HTML encoding applied to
// it; i.e., no character references
// Output: A single-quoted HTML attribute value
function QuoteHTMLAttributeValue(s: string): string;
begin
s := StringReplace(s, '&', '&amp;', [rfReplaceAll]);
s := StringReplace(s, '''', '&apos;', [rfReplaceAll]);
Result := '''' + s + '''';
end;

我选择使用撇号而不是引号,因为这使 PHP 转义更容易。如果您对 PHP 字符串使用引号,那么您需要担心变量插值。有了撇号,这个问题就迎刃而解了。

通过制作 QuoteStringForPHP负责引用和转义,你让转义变得容易。无需再猜测哪些字符需要转义,因为它们都需要转义。不需要转义的只在转义工作完成后添加。

关于delphi - 如何转义由 Delphi 生成的引号 PHP 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3243285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com