我一直在尝试将正则表达式从ruby转换为PHP,但是我没有运气.
这是ruby正则表达式:
QUOTED_LITERAL = /"[^"\\]*(?:\\.[^"\\]*)*"/
UNQUOTED_LITERAL = /[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/
LITERAL = /(#{QUOTED_LITERAL}|#{UNQUOTED_LITERAL})/
PAIR = /#{LITERAL}\s*=>\s*#{LITERAL}/
Run Code Online (Sandbox Code Playgroud)
这是我的PHP:
const PAIR = '/("[^"\\]*(?:\\.[^"\\]*)*"|[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*)\s*=>\s*("[^"\\]*(?:\\.[^"\\]*)*"|[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*)/';
Run Code Online (Sandbox Code Playgroud)
但是,当我跑
$result = preg_match_all(self::PAIR, $input, $matches);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
preg_match_all(): Compilation failed: unmatched parentheses at offset 62
但是,当运行它时,http://www.phpliveregex.com/与测试数据:
"foo" => "bar", "foo" => bar, foo => "bar"
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常.
不知道最近发生了什么.
删除所有反斜杠后,我设法编译它。
然后,我用 4 个双斜杠替换了所有双斜杠,并且preg_match_all()也能够编译正则表达式。
const PAIR = '/("[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|[^\s=,][^\s=,\\\\]*(?:\\\\.[^\s=,\\\\]*|=[^,>])*)\s*=>\s*("[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|[^\s=,][^\s=,\\\\]*(?:\\\\.[^\s=,\\\\]*|=[^,>])*)/';
Run Code Online (Sandbox Code Playgroud)
您可能需要编辑它才能获得您想要的确切正则表达式。您遇到编译错误,因为\\它被输入到正则表达式引擎中\,它转义了直接方括号。要对文字反斜杠进行编码,您需要\\\\对字符串使用一次 - 一次,对正则表达式引擎使用一次。
string '\\\\' --becomes--> regex \\ --becomes--> literal \
Run Code Online (Sandbox Code Playgroud)
Ruby 不存在这个问题,因为它的正则表达式语法与字符串语法是分开的。
(相关问题:preg_match(): Compilation failed: unmatched括号。)
| 归档时间: |
|
| 查看次数: |
503 次 |
| 最近记录: |