我有很多年来编写的大量php文件,我需要将所有短开标签正确替换为正确的显式开放标签.
change "" into "我认为这个正则表达式将正确选择它们:
<\?(\s|\n|\t|[^a-zA-Z])照顾像这样的案件
// /*但我不知道如何处理整个文件夹树并检测.php文件扩展名并应用正则表达式并在文件更改后保存.
如果你掌握了正确的工具,我觉得这可以非常简单.(sed手册中有一个有趣的黑客:4.3示例/将文件重命名为小写).
也许我错了.
或许这可能是一个oneliner?
1> ax...:不要使用正则表达式来解析正式语言 - 你总会遇到你没想到的干草堆.喜欢:
$bla = '?> now what? ';使用知道语言结构的处理器更安全.对于html,这将是一个xml处理器; 对于php,内置的tokenizer扩展.它有
T_OPEN_TAG
解析器令牌,匹配,
或
<%
,和T_OPEN_TAG_WITH_ECHO
,匹配=
或<%=
.替换所有短开的标签,你会发现所有这些令牌和更换T_OPEN_TAG
用,并
T_OPEN_TAG_WITH_ECHO
用.
实施留给读者的练习:)
编辑1:指挥官是如此善良提供一个.
编辑2:与系统
short_open_tag
中关闭了php.ini
,,
<%
,并=
不会被替代脚本的认可.要使脚本在此类系统上运行,请short_open_tag
通过命令行选项启用:php -d short_open_tag=On short_open_tag_replacement_script.phpps token_get_all()的手册页和googleing for tokenizer,token_get_all和解析器令牌名称的创意组合可能有所帮助.
pps还看到Regex解析define()内容,可能吗?在这里
@Polypheme:<?xml version ="1.0"encoding ="UTF-8"?>
2> ringmaster..:如果您使用的是tokenizer选项,这可能会有所帮助:
$content = file_get_contents($file); $tokens = token_get_all($content); $output = ''; foreach($tokens as $token) { if(is_array($token)) { list($index, $code, $line) = $token; switch($index) { case T_OPEN_TAG_WITH_ECHO: $output .= '请注意,如果未启用短标记,则标记生成器将无法正确标记短标记.也就是说,您无法在短标签不起作用的系统上运行此代码.您必须在其他地方运行它来转换代码.
3> hakre..:作为 工具中的固定器,已经解决了该问题,该
php-cs-fixer
工具可以轻松安装并经过测试和维护。然后修复很容易:
$ php-cs-fixer fix --fixers=short_tag --diff --dry-run只需替换
为您要更改的目录或文件的路径即可。给定的命令是首先检查(
--dry-run
和--diff
参数)。安装就像
$ composer global require friendsofphp/php-cs-fixer如果您已经在路径中安装了composer并在全局composer bin目录中安装(推荐)。
最新版本的php-cs-fixer使用以下语法:```php-cs-fixer fix --rules = full_opening_tag --diff --dry-run .`''