我的代码中充斥着类似这样的内容
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"]
- 最好只是手动编写顶部显示的乱码?
有什么想法吗?我现在要google“从delphi生成php” - 这可能是我几周前应该做的: - /
答案 0 :(得分:1)
我已多次读过你的问题,但我无法理解你的问题是什么。我会保留代码原样。
但似乎你不想在你的代码中使用这个微小但令人烦恼的转义字符?如您所述,转义算法非常容易出错。它试图在没有语义信息的情况下解决句法问题。但是,如何使用此信息提供解析算法?是的,使用转义字符。 但似乎你不想在你的代码中使用这个微小但令人讨厌的转义字符?如您所述,转义算法非常容易出错。它试图在没有语义信息的情况下解决句法问题。但是,如何使用此信息提供解析算法?是的,使用转义字符。 但似乎你不想在你的代码中使用这个微小但令人讨厌的转义字符?如您所述,转义算法非常容易出错。它试图在没有语义信息的情况下解决句法问题。但是,如何使用此信息提供解析算法?是的,使用转义字符。 ...
- )
答案 1 :(得分:1)
嗯,我不知道你的能力,所以我不知道你是否可以自己做。它并非完全无关紧要(因为插入时字符位置会发生变化),但我认为这对于第一个编程类来说是一个问题。 (看那些不变量!)
function escapephp(s: string):string;
var first,n,cur,lastcur : integer;
begin
result:=s;
first:=pos('"',result);
if first>0 then // first found?
begin
n:=0;
cur:=first;
while cur<>0 do
begin
lastcur:=cur; // keep last found
cur:=posex('"',result,lastcur+1); // search next
if (lastcur<>first) and (cur<>0) then // next is not last and not first?
begin
insert('\"',result,lastcur); // then insert
inc(cur,2); // we inserted 2 chars so need to correct with 2
end;
end;
end;
end;
该示例可以进行更彻底的测试,我只是在您的字符串上快速测试
答案 2 :(得分:1)
你不只是生成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, '&', '&', [rfReplaceAll]);
s := StringReplace(s, '''', ''', [rfReplaceAll]);
Result := '''' + s + '''';
end;
我选择使用撇号而不是引号,因为这样可以更轻松地逃避PHP。如果对PHP字符串使用引号,则需要担心变量插值。有了撇号,这个问题就消失了。
通过让QuoteStringForPHP
负责引用和转义,您可以轻松转义。没有更多关于哪些角色需要逃脱的猜测,因为他们所有都做了。只有在逃避工作完成后才会添加不需要转义的那些。