【问题标题】:Regex for matching markup in PHPish markup?在 PHPish 标记中匹配标记的正则表达式?
【发布时间】:2010-02-15 03:48:09
【问题描述】:

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

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

原件:

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

转换:

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

如何在考虑引号的同时工作? (如&lt;?code $var='&lt;?code stuff ?&gt;';?&gt;

另外,如果有人向我提供了一些东西来检测包含的文件,(替换为首先“预先拥有”文件然后包含它的东西)(其中包含类似于 PHP)

这甚至可以使用正则表达式吗?我知道您不打算尝试使用正则表达式解析 HTML,但这并不是在尝试解析它,它对于标记和所有内容的方式真的很愚蠢..

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

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

编辑:还请注意,标记内的语言实际上可以是 Ruby。因此它可以包含具有结束代码标记的引号和 cmets。

【问题讨论】:

  • 不,正则表达式无法进行这样的替换。
  • 那么你将如何编写一个相当快的解析器来完成它呢?正则表达式肯定能帮上忙吗?
  • 回声标记在我看来很可疑。最后,这就是&lt;?php?&gt; 的用途。你确定你需要这个吗?你考虑过输出缓冲吗?
  • 这实际上与 PHP 无关,但它是我能解释它的最简单的方法。实际上不会有任何 PHP 被转换,它是用于编写与 PHP 非常相似的东西这是标记。
  • 好的,但是您正在尝试转换 PHP(嵌入了 HTML)源文件,对吗?只是不是使用 PHP 而是 Ruby,对吗?

标签: ruby regex preprocessor


【解决方案1】:

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

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

编辑 2:

这甚至可以使用正则表达式吗?我知道您不打算尝试使用正则表达式解析 HTML,但这并不是尝试解析它,它对于标记和所有内容的方式真的很愚蠢..

解析正常。您可以使用正则表达式将您的输入拆分为标记(也称为标记化)。由于大多数语言都是上下文相关的,因此您必须将标记提供给状态机,该状态机可以将代码解析为内部表示(AST)。然后可以将其转换为您的目标输出。这听起来很复杂而且很吓人,但是当你尝试了几次之后,它真的很简单。我建议您在 Wikipedia 和 Google 的帮助下完成它。

【讨论】:

  • 不,这不是我想要的(标记中的实际代码不会是 PHP)。抱歉,更改了我的问题以更好地反映我的意图。
  • 好吧,这不是我想要的......但我猜这就是答案:((尽管以防万一,把问题留得更久)
  • 请记住,您不需要编写能够识别整个语言的解析器。将其标记为具有与您要操作的内容相关的上下文的部分就足够了。例如。按注释分隔符、字符串文字分隔符、反斜杠和您正在搜索的实际标记进行拆分。这样就形成了一个相当简单的状态机。
【解决方案2】:

更多的想法而不是答案:

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

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

【讨论】:

  • 捕获这个 PHP 块怎么样:&lt;?php echo 'no closing tag: ?&gt;'; /* also no closing tag ?&gt; */ ?&gt;
  • 嗯.. 好点.. 我想它必须是一个混合解析器.. 适当地替换所有标记并解析 &lt;?php 中的所有内容以捕捉这样的技巧。
  • 公平点,也许标记器可能值得研究。
  • 确实,我认为 troelskn 的答案是正确的方法。
猜你喜欢
  • 1970-01-01
  • 2013-11-27
  • 2010-12-14
  • 2018-09-01
  • 2012-04-02
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多