Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将正则表达式从ruby转换为PHP_Php_Ruby_Regex - Fatal编程技术网

将正则表达式从ruby转换为PHP

将正则表达式从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}/

我一直在尝试将一个正则表达式从ruby转换为PHP,但是我运气不好

这是ruby正则表达式:

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。我们在一个特定的页面上遇到了一些版本的问题,尽管我记不清是哪一个版本。