用于在PHPish标记中匹配标记的正则表达式?

时间:2010-02-14 19:10:28

标签: ruby regex preprocessor

我正在创建一个项目,我需要能够使用正则表达式(或者如果有其他更好的东西?)

基本上,我需要转换一个PHPish标记代码页,以便将“非代码”转换为“代码”。例如:

原单:

<?code
  echo 'some text';
?>
<head>
</head>
<body>
</body>
<?code
  echo '</html>';
?>

转换:

<?code
  echo '<html>';
  echo '
<head>
</head>
<body>
</body>';
  echo '</html>';
?>

在考虑报价的同时,这怎么可行呢? (如<?code $var='<?code stuff ?>';?>

另外,如果有人向我提供了检测包含文件的内容,(替换首先“预先发布”文件的内容然后包含它)(其中包含类似于PHP)

这是否可以使用正则表达式?我知道你不要试图用正则表达式来解析HTML,但这并不是要解析它,对于标记和一切都是如此真的非常愚蠢。

此外,这个项目实际上将在Ruby(预处理器)中实现,所以如果Ruby有一些东西可以帮助实现这一点,那么就可以了。

我知道代码看起来非常类似于PHP,但那是因为它是,但它不会在PHP中实现,并且使用的“代码”实际上不是PHP,但它将使用<?用于在标记中包含代码的类型机制。

编辑:还要注意,标记内的语言可以用于所有实际目的,而不是Ruby。因此它可以包含具有结束代码标记的引号和注释。

2 个答案:

答案 0 :(得分:3)

您可以使用token_get_all获取解析器令牌流。循环遍历它们并回显它们,当你遇到T_INLINE_HTML时,你可以将它重写为一个echo语句。

编辑 - 刚刚看到你说你正在使用Ruby。显然,你不能在Ruby中使用PHP的tokeniser。也许你可以通过命令行调用php?

编辑2:

  

这是否可以使用正则表达式?我知道你不要试图用正则表达式来解析HTML,但这并不是要解析它,对于标记和一切都是如此真的非常愚蠢。

它解析得很好。您可以使用regexp将输入拆分为标记(也称为标记化)。由于大多数语言都是上下文的,因此您必须将令牌提供给状态机,状态机可以将代码解析为内部表示(AST)。然后可以将其转换为目标输出。这听起来很精致和可怕,但是当你尝试了几次时它真的很简单。我建议你在维基百科和谷歌的帮助下完成它。

答案 1 :(得分:0)

更多的想法而不是答案:

我建议你尝试找一些可以找到PHP块的正则表达式,然后将其他所有内容包装在echo中,而不是反过来。

另一种选择可能是查看PHP tokenizer,但我不确定它如何处理我害怕的标签之外的HTML部分。