因为我有一个非常冗余的配置文件格式..我发明了一个自定义脚本格式来编写循环,例如:
[Config Object]
{Loop 3
Setting[i] = Value[i]
}
OtherSetting=X
这将导致:
[Config Object]
Setting1 = Value1
Setting2 = Value2
Setting3 = Value3
OtherSetting = X
我的第一个想法是使用正则表达式,就像这样:
!{(.*?)}!is
在我尝试将它与嵌套循环一起使用之前,它一直工作得很好——你肯定知道这个“哦……时刻”
因为以下原因:
1: [Config Object]
2: *{*Loop 3
3: Section[i]
4: {Loop 3
5: Setting[i] = Value[i]
6: *}*
7: }
8: OtherSetting=X
将引导正则表达式覆盖第 2 行和第 6 行之间的范围(用 *s 营销它们)
实际上我真的不知道如何解决这个问题,因为正则表达式在逻辑上是正确的。
那个?需要 Lazy-Operator,因为如果没有它,我会在另一个方向上遇到同样的问题,并且无法编写两个后续循环。
一些研究让我清楚正则表达式在这里不是正确的方向, 但我找不到任何 PHP 解决方案。 那么,我如何在 PHP 中高效地解析我的“循环”脚本,例如获取一个带有循环的数组,并将大括号内的命令替换为计算结果?
最佳答案
评论中提到了正确的解决方案。您需要实际编写一个编译器/解析器。对于我的编译器类(class),我的内存有点模糊,但这里是你将如何处理它。
基本概念是将输入转换为标记(这是正则表达式可以的地方)。这称为词法分析
所以:
[Config Object]
{Loop 3
Section[i]
{Loop 3
Setting[i] = Value[i]
}
}
OtherSetting=X
变成(伪代码标记,可能不完全是你需要的)
OPEN_BRACKET STRING(=Config Object) CLOSE_BRACKET
START_LOOP NUMBER(=3)
STRING(=Section) OPEN_BRACKET STRING(=i) CLOSE_BRACKET
START_LOOP NUMBER(=3)
STRING(=Setting) OPEN_BRACKET STRING(=i) CLOSE_BRACKET EQUAL STRING(=Value) OPEN_BRACKET STRING(=i) CLOSE_BRACKET
END_LOOP
END_LOOP
STRING(=OtherSetting) EQUAL STRING(=X)
因此,如果您的词法分析器为您提供了一个像上面那样的标记数组,您只需要将其解析为实际的语法(所以这是您不需要的地方想使用正则表达式)。
你的语法(对于循环)是这样的(伪代码语法有点像 Bison,我可能忘记了部分/故意遗漏了一些东西):
INDEXED_CONFIG_LINES: INDEXED_CONFIG_LINE | INDEXED_CONFIG_LINES INDEXED_CONFIG_LINE;
INDEXED_CONFIG_LINE: STRING OPEN_BRACKET STRING CLOSE_BRACKET EQUAL STRING OPEN_BRACKET STRING CLOSE_BRACKET;
LOOP: START_LOOP NUMBER LOOP_BODY END_LOOP;
LOOP_BODY: INDEXED_CONFIG_LINES | LOOP;
因此,您需要一个可以使用该语法构建语法树的解析器,而不是正则表达式。您基本上只是在构建一个状态机,您可以在其中将下一个标记转换为某个状态(例如在循环体中等)。
老实说,YAML 可能会满足您的需求,而不是重新发明轮子或求助于正则表达式体操。但是如果您真的需要使用您建议的循环语法,您可以查看 Symfony Yaml 组件以了解它们是如何进行解析的。 https://github.com/symfony/Yaml
或者您可以查看 Twig 中的另一个具有循环的解析器:https://github.com/fabpot/Twig/tree/master/lib/Twig
关于php - 在 PHP 中创建脚本解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19691557/
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und
我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?