代码之家  ›  专栏  ›  技术社区  ›  Mawg says reinstate Monica

如何对Delphi生成的PHP字符串进行转义?

  •  2
  • Mawg says reinstate Monica  · 技术社区  · 14 年前

    我的代码里到处都是这样的东西

        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”——这可能是我几周前应该做的:-/

    3 回复  |  直到 14 年前
        1
  •  1
  •   Rob Kennedy dkackman    14 年前

    您不仅仅是生成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;
    

    通过制造 QuoteStringForPHP 负责报价 逃跑,你让逃跑变得容易。没有更多的猜测关于哪些角色需要转义,因为它们 全部的 去吧。不需要转义的只在转义工作完成后添加。

        2
  •  1
  •   splash    14 年前

    我把你的问题读了好几遍,但我不明白你的问题是什么。我会保持原样。

    但似乎您不想在代码中使用这个很小但很烦人的转义字符?正如您所描述的,转义算法非常容易出错。它试图解决一个没有语义信息的句法问题。但是如何为解析算法提供这些信息呢?对,使用转义字符。 但似乎您不想在代码中使用这个很小但很烦人的转义字符?正如您所描述的,转义算法非常容易出错。它试图解决一个没有语义信息的句法问题。但是如何为解析算法提供这些信息呢?对,使用转义字符。。。

    ;-)

        3
  •  1
  •   Marco van de Voort    14 年前

    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;