将正则表达式从ruby转换为PHP
我一直在尝试将一个正则表达式从ruby转换为PHP,但是我运气不好 这是ruby正则表达式:将正则表达式从ruby转换为PHP,php,ruby,regex,Php,Ruby,Regex,我一直在尝试将一个正则表达式从ruby转换为PHP,但是我运气不好 这是ruby正则表达式: QUOTED_LITERAL = /"[^"\\]*(?:\\.[^"\\]*)*"/ UNQUOTED_LITERAL = /[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/ LITERAL = /(#{QUOTED_LITERAL}|#{UNQUOTED_LITERAL})/ PAIR = /#{LITERAL}\s*=>\s*#{LITERAL}/
QUOTED_LITERAL = /"[^"\\]*(?:\\.[^"\\]*)*"/
UNQUOTED_LITERAL = /[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/
LITERAL = /(#{QUOTED_LITERAL}|#{UNQUOTED_LITERAL})/
PAIR = /#{LITERAL}\s*=>\s*#{LITERAL}/
这是我在PHP中的目标:
const PAIR = '/("[^"\\]*(?:\\.[^"\\]*)*"|[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*)\s*=>\s*("[^"\\]*(?:\\.[^"\\]*)*"|[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*)/';
但是当我跑的时候
$result = preg_match_all(self::PAIR, $input, $matches);
我得到一个错误:
preg\u match\u all():编译失败:偏移量62处的括号不匹配
但是,当使用测试数据运行时:
"foo" => "bar", "foo" => bar, foo => "bar"
它似乎工作得很好
不确定发生了什么。问题在于你的反斜杠。
在删除所有反斜杠后,我成功地将其编译
然后,我用其中的4个替换了所有的双斜杠,preg\u match\u all()
也能够编译正则表达式
const PAIR = '/("[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|[^\s=,][^\s=,\\\\]*(?:\\\\.[^\s=,\\\\]*|=[^,>])*)\s*=>\s*("[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|[^\s=,][^\s=,\\\\]*(?:\\\\.[^\s=,\\\\]*|=[^,>])*)/';
您可能需要编辑它以获得所需的确切正则表达式。出现编译错误是因为\\
以\
的形式馈送到正则表达式引擎,而正则表达式引擎没有使用直接的方括号。要对文字反斜杠进行编码,您需要使用\\\\\
——一次用于字符串,一次用于正则表达式引擎
string '\\\\' --becomes--> regex \\ --becomes--> literal \
Ruby没有这个问题,因为它的正则表达式语法与字符串语法是分开的
(相关问题:)您的PHP版本是什么?只需执行“php--version”,它就是PHP5.5.1。生活在边缘!我在5.4.2+中使用php的preg_匹配时遇到了几个问题。你可能会尝试较低版本,可能会解决你的问题。@adrian-真的吗?preg使用与大多数其他编程语言(包括ruby)相同的regexp库。我觉得很难相信它应该是有童车的。在infoarena.ro上,我们使用的纺织品非常依赖preg。我们在一个特定的页面上遇到了一些版本的问题,尽管我记不清是哪一个版本。