gpt4 book ai didi

php - Sed 替换
转载 作者:行者123 更新时间:2023-12-04 03:16:24 24 4
gpt4 key购买 nike

我有一些真的旧代码 (php 5.1) 需要在较新的服务器上运行。

新服务器有 PHP 5.6,所以任何地方

<?

用于打开 PHP 上下文,这些内容未被正确解释。我需要替换所有实例

<?

<?php

除了哪里

<?

已经是

的一部分
<?php

我最初的努力是使用反向引用和 sed:

cat file.php | sed -i 's/<?([^php])/<?php\$1/g'

但是,() 似乎打破了匹配,没有它,我无法获得正确的反向引用。

我试图将 之后 PHP 开始标记放入反向引用中,这样我就可以像这样转换行:

<?=$_COOKIE...

进入

<?php=$_COOKIE...

而且,请不要指向我:Using sed to replace <? with <?php .我已经看到了,它并没有解决我在某些地方已经有了新的开始标签而在其他地方已经有了旧标签的事实。 (其中一个答案确实如此,但我不想创建“phpphphphpphp”并且必须一遍又一遍地搜索它以将其减少为“php”

最后,请原谅奇怪间隔的开始和结束标签。 SO 无法将它们显示在与文本一致的位置,除非它们位于代码块中。

最佳答案

你可以这样做:

sed 's/<?\(php\)*/<?php/g' file

在这种情况下,“php”是可选的,但如果它已经存在,则会被系统地覆盖。

或者按照 AbraCadaver 的建议使用空白字符,因为在短标记之后它似乎是强制性的:

sed 's/<?\([[:space:]]\)/<?php\1/g' file

局限性:这个模式不知道是否<?<?php在一个字符串中。示例:

echo 'abc <? def';

变成:

echo 'abc <?php def';

更好的方法是将 PHP 本身与 tokenizer 一起使用.

例子:

$str = 'echo "blah"; <? echo "sblub"; ?> bluh';

$result = '';

foreach(token_get_all($str) as $tok) {
$result .= ($tok[0] == 376) ? '<?php' : $tok[1];
}

echo $result;

关于php - Sed 替换 <?用 <?php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40620042/

24 4 0

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