Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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
正则表达式在PHP中工作,在Erlang中不工作。为什么?_Php_Regex_Erlang - Fatal编程技术网

正则表达式在PHP中工作,在Erlang中不工作。为什么?

正则表达式在PHP中工作,在Erlang中不工作。为什么?,php,regex,erlang,Php,Regex,Erlang,我试图将用PHP编写的url解析函数重写为Erlang。我发现这些正则表达式在Erlang中不起作用,但在PHP代码中可以很好地工作。你能告诉我为什么以及如何让它与Erlang一起工作吗 Loose = "^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((?:\/(\w:))?(\/(?:[^?#](?![^?#\/]*\.[^?#\/.

我试图将用PHP编写的url解析函数重写为Erlang。我发现这些正则表达式在Erlang中不起作用,但在PHP代码中可以很好地工作。你能告诉我为什么以及如何让它与Erlang一起工作吗

Loose = "^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((?:\/(\w:))?(\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)".

re:compile( Loose ). 
{error,{"nothing to repeat",166}}



Strict = "^(?:([^:\/?#]+):)?(?:\/\/\/?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?(((?:\/(\w:))?((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)".

re:compile( Strict ).                  
{error,{"nothing to repeat",114}}
但这段代码运行良好:

$url = "http://gazeta.ru/";

$loose = '/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((?:\/(\w:))?(\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/';

preg_match($loose, $url, $match);

var_dump( $match );

字符\在Erlang的字符串中是特殊的。还有一些特殊字符前面必须加反斜杠,包括双引号和反斜杠。标记特殊字符的技术称为转义,反斜杠本身称为转义字符。因此\后面必须跟另一个字符。例如,如果要在字符串中包含字符“\”和一个反斜杠,则应写入\:

CorrectString = "C:\\windows" %% Correct

WrongString = "C:\windows" %% Wrong
因此,您必须将regexp中的所有单反斜杠更改为双反斜杠。以下是erlang shell中的一个示例:

3> Loose = "^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/\\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\\/?#]*)(?::(\\d*))?)(((?:\\/(\\w:))?(\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)".                                                                               
4> re:compile(Loose).
{ok,{re_pattern,14,0,                                                        
                <<69,82,67,80,147,2,0,0,16,0,0,0,1,0,0,0,14,0,0,0,0,0,0,
                  ...>>}}

字符\在Erlang的字符串中是特殊的。还有一些特殊字符前面必须加反斜杠,包括双引号和反斜杠。标记特殊字符的技术称为转义,反斜杠本身称为转义字符。因此\后面必须跟另一个字符。例如,如果要在字符串中包含字符“\”和一个反斜杠,则应写入\:

CorrectString = "C:\\windows" %% Correct

WrongString = "C:\windows" %% Wrong
因此,您必须将regexp中的所有单反斜杠更改为双反斜杠。以下是erlang shell中的一个示例:

3> Loose = "^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/\\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\\/?#]*)(?::(\\d*))?)(((?:\\/(\\w:))?(\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)".                                                                               
4> re:compile(Loose).
{ok,{re_pattern,14,0,                                                        
                <<69,82,67,80,147,2,0,0,16,0,0,0,1,0,0,0,14,0,0,0,0,0,0,
                  ...>>}}

天啊。我忘记了:谢谢你的帮助天啊。我忘记了:谢谢你的帮助