gpt4 book ai didi

PHP结束标记删除换行符

转载 作者:太空狗 更新时间:2023-10-29 13:26:44 25 4
gpt4 key购买 nike

我正在做像SLIM或Jade的experiment, an html preprocessor

这是看起来正确的 PHP 代码:

nav
ul id: "test"
li
@<?= $Var; ?>
li
@About
li
@Contact

这是 预期的预处理html (是,$ Var ==“Test”):
nav
ul id: "test"
li
@Test
li
@About
li
@Contact

但是,在 浏览器中,我得到了这个 错误的文本,作为 预处理器html :
nav
ul id: "test"
li
@Test li
@About
li
@Contact

最后,有两种方法可以使其正确。
  • 手动添加换行符:
    nav
    ul id: "test"
    li
    @<?= $Var . "\n"; ?>
    li
    @About
    li
    @Contact
  • 在PHP结束标记(??)后写一个空格。

  • 为什么第一种情况<?= $Var; ?>忽略了封闭PHP标记后的换行符? 我真的找不到任何东西,因为google带来了太多的结果,说明为什么您应该对我所做的每次搜索而不是我想找到的内容都忽略结束标记。

    最佳答案

    更新:
    查看zend语言扫描器src,似乎我的“预感”是正确的:T_CLOSE_TAG token 似乎可能包含换行符。而且,似乎脚本中包含结束标记的最后一条语句的结束分号是可选的...

    <ST_IN_SCRIPTING>("?>"|"</script"{WHITESPACE}*">"){NEWLINE}? {
    ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */
    BEGIN(INITIAL);
    return T_CLOSE_TAG; /* implicit ';' at php-end tag */
    }

    只需在 the zend_language_scanner.c and zend_language_scanner.l files here中查找 T_CLOSE_TAG
    可以肯定的是,我目前正在扫描Zend引擎的源代码,但是我猜测,由于您发布的代码的最后一个字符只是结束标记( ?>),因此PHP是生成输出。似乎您没有告诉PHP输出换行符,因此可以推断PHP不会在要回显的任何内容上添加新行。
    当然,PHP会忽略结束标记后面的换行符char,但是由于某些原因,PHP确实确实在使用该换行符。我正在查看解析您的PHP脚本的C代码,但我认为它可能使用换行符,空格,逗号的分号以及所有这些作为标记将输入分块到节点中。
    由于结束标记 ?>是一个真正的 token ,并且是PHP语法的一部分,很可能是这是引擎有效使用换行符的地方,以及为什么它不是输出的一部分。

    通过在结束标记后添加一个空格字符,可能会占用空间,而不会换行,因此这就是为什么您仍然看到换行符的原因。
    我还尝试将2个换行符添加到一些测试代码中,的确如此:输出仅显示1条新行:
    foo:
    <?= $bar; ?>

    foobar

    输出:
    foo:
    bar
    foobar

    因此,似乎我的怀疑可能会搁浅。

    但是,考虑到所有因素,以免您想逃避Zend引擎源的麻烦,手动添加换行符并不是一件很麻烦的事情。实际上,这是确保生成正确换行符的好方法:
    假设您在一个健康的* NIX系统上写了一些代码,其中换行符是 \n转义序列表示的所有意图和目的,并且手动添加char可能无法在Windows系统(例如Windows系统)上产生所需的输出。使用 \r\n),Apple系统使用 \r ...
    PHP有一个常数来确保您根据代码所在的平台来调出正确的换行符: PHP_EOL。为什么不使用它:
    <?= $bar, PHP_EOL; ?>

    如果您想知道:是的,那是您在那看到的 $bar逗号 PHP_EOL。为什么?可以将 echo<?=视为C++的 COUT,它是一种结构,可以将您要扔给它的任何内容推送到输出流,可以是连接字符串,也可以是逗号分隔的变量列表:这无关紧要。

    现在,我的答案的以下部分将变得有点题外话,但这只是基本的,不言而喻的事情,但是许多人对此却一无所知,以至于我无法抗拒解释某件东西的诱惑。关于字符串串联的一两件事。
    PHP,以及我所知的大多数语言,都不在乎要推送到输出流的var/val数量。这就是它的目的。同样,PHP:大多数语言确实关心字符串的串联:字符串是一种常量值。当情绪使您无法适应时,您不能只是将字符串变长。一系列字符必须存储在内存中,必须分配内存以容纳更长的字符串。串联有效执行的操作(最佳情况)是:
  • 计算string1和string2的长度
  • 分配将string2连接到字符串1所需的额外内存
  • 将字符串2复制到新(额外)分配的内存

  • 而在很多情况下,实际发生的是:
  • 计算两个字符串的长度
  • 分配内存,以同时连接两个字符串
  • 将两个字符串都复制到新分配的内存块
  • 将新指针分配给需要分配
  • 的变量
  • 释放不再引用的任何内存

  • 第一种情况的示例:
    $str1 = 'I am string constant 1';
    $str2 = ' And I\'ll be concatenated';
    $str1 .= $str2;

    可以转换为以下C代码:
    char *str1, *str2;
    //allocate mem for both strings, assign them their vals
    str1 = realloc(str1,(strlen(str1) + strlen(str2)+1));//re-allocate mem for str1
    strncat(str1, str2, strlen(str2);//concatenate str2 onto str1

    但是,只需执行以下操作:
    $str3 = $str1 . $str2;

    您实际上正在做的是:
    char *str3 = malloc((strlen(str1) + strlen(str2) + 1)*sizeof(char));
    strcpy(str3, str1);//copy first string to newly allocated memory
    strcat(str3, str2);//concatenate second string...

    似乎还不够,请考虑以下代码的含义:
    $str1 = $str2 . $str1;

    是的,当然可以:
    char *str3 = malloc((strlen(str1) + strlen(str2) + 1)*sizeof(char));
    strcpy(str3, str2);//copy seconds string to start of new string
    strcat(str3, str1);//add first string at the end
    free(str1);//free memory associated with first string, because we're reassigning it
    str1 = str3;//set str1 to point to the new block of memory

    现在我还没有真正的串联梦night(不用担心,我也不会)。像 $foo = 'I ' . ' am '. 'The'. ' ' .$result.' of some'.1.' with a dot'.' fetish';这样的东西。看看它,里面有变量,可能是任何东西(数组,对象,huuuge字符串...,里面也有整数...用逗号替换点并将其推到 echo构造中就这么多比开始考虑编写将所有这些值正确连接在一起所需的代码更容易...
    抱歉,我想在这里稍微走一下,但由于是这样,IMO非常基础,我觉得每个人都应该意识到这一点...

    关于PHP结束标记删除换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20596098/

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