-
Notifications
You must be signed in to change notification settings - Fork 105
/
Copy pathparse-url.xml
289 lines (280 loc) · 8.39 KB
/
parse-url.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 4266e03897e77751a6cf7d15f9556c92124d8df3 Maintainer: HonestQiao Status: ready -->
<!-- CREDITS: dallas, mowangjuanzi -->
<refentry xml:id="function.parse-url" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>parse_url</refname>
<refpurpose>解析 URL,返回其组成部分</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>int</type><type>string</type><type>array</type><type>null</type><type>false</type></type><methodname>parse_url</methodname>
<methodparam><type>string</type><parameter>url</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>component</parameter><initializer>-1</initializer></methodparam>
</methodsynopsis>
<para>
本函数解析 URL 并返回关联数组,包含在 URL 中出现的各种组成部分。数组的元素值<emphasis>不会</emphasis>
URL 解码。
</para>
<para>
本函数<emphasis role="strong">不是</emphasis>用来验证给定 URL
的有效性的,只是将其分解为下面列出的部分。也会接受不完整或无效的 URL,<function>parse_url</function> 会尝试尽量正确解析。
</para>
<caution>
<para>
此函数可能无法对相对和无效 URL 提供正确的结果,结果甚至可能会跟常见的 HTTP 客户端行为不匹配。如果需要解析来自不受信任输入的
URL,则需要另外验证,例如,使用带 <constant>FILTER_VALIDATE_URL</constant> 过滤器的 <function>filter_var</function>。
</para>
</caution>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>url</parameter></term>
<listitem>
<para>
要解析的 URL。
</para>
</listitem>
</varlistentry>
</variablelist>
<variablelist>
<varlistentry>
<term><parameter>component</parameter></term>
<listitem>
<para>
指定 <constant>PHP_URL_SCHEME</constant>、<constant>PHP_URL_HOST</constant>、<constant>PHP_URL_PORT</constant>、<constant>PHP_URL_USER</constant>、<constant>PHP_URL_PASS</constant>、<constant>PHP_URL_PATH</constant>、<constant>PHP_URL_QUERY</constant>
或 <constant>PHP_URL_FRAGMENT</constant> 的其中一个来获取 URL 中指定的部分的
<type>string</type>。(当指定为 <constant>PHP_URL_PORT</constant> 时,返回值将是 <type>int</type>)。
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
对严重不合格的 URL,<function>parse_url</function> 可能会返回 &false;。
</para>
<para>
如果省略了 <parameter>component</parameter> 参数,将返回关联数组 <type>array</type>。至少会有一个元素出现在数组中。数组中可能的键有以下几种:
<itemizedlist>
<listitem>
<simpara>
<varname remap="structfield">scheme</varname>——如 <literal>http</literal>
</simpara>
</listitem>
<listitem>
<simpara>
<varname remap="structfield">host</varname>
</simpara>
</listitem>
<listitem>
<simpara>
<varname remap="structfield">port</varname>
</simpara>
</listitem>
<listitem>
<simpara>
<varname remap="structfield">user</varname>
</simpara>
</listitem>
<listitem>
<simpara>
<varname remap="structfield">pass</varname>
</simpara>
</listitem>
<listitem>
<simpara>
<varname remap="structfield">path</varname>
</simpara>
</listitem>
<listitem>
<simpara>
<varname remap="structfield">query</varname>——在问号 <literal>?</literal> 之后
</simpara>
</listitem>
<listitem>
<simpara>
<varname remap="structfield">fragment</varname>——在注释符号 <literal>#</literal> 之后
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
如果指定 <parameter>component</parameter> 参数,<function>parse_url</function> 返回 <type>string</type> (或在指定为
<constant>PHP_URL_PORT</constant> 时返回 <type>int</type>)而不是 <type>array</type>。如果 URL
中指定的组成部分不存在,将会返回 &null;。自 PHP 8.0.0 起,<function>parse_url</function> 开始对 query 和 fragment
区分不存在和空值。
</para>
<para>
<informalexample>
<screen>
<![CDATA[
http://example.com/foo → query = null, fragment = null
http://example.com/foo? → query = "", fragment = null
http://example.com/foo# → query = null, fragment = ""
http://example.com/foo?# → query = "", fragment = ""
]]>
</screen>
</informalexample>
</para>
<para>
之前所有的情况都会导致 query 和 fragment 为 &null;。
</para>
<para>
注意组件中的控制字符(参见 <function>ctype_cntrl</function>)替换为下划线(<literal>_</literal>)。
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.0.0</entry>
<entry>
<function>parse_url</function> 现在对 query 和 fragment
区分不存在和空值。
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>parse_url</function> 示例</title>
<programlisting role="php">
<![CDATA[
<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url));
var_dump(parse_url($url, PHP_URL_SCHEME));
var_dump(parse_url($url, PHP_URL_USER));
var_dump(parse_url($url, PHP_URL_PASS));
var_dump(parse_url($url, PHP_URL_HOST));
var_dump(parse_url($url, PHP_URL_PORT));
var_dump(parse_url($url, PHP_URL_PATH));
var_dump(parse_url($url, PHP_URL_QUERY));
var_dump(parse_url($url, PHP_URL_FRAGMENT));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(8) {
["scheme"]=>
string(4) "http"
["host"]=>
string(8) "hostname"
["port"]=>
int(9090)
["user"]=>
string(8) "username"
["pass"]=>
string(8) "password"
["path"]=>
string(5) "/path"
["query"]=>
string(9) "arg=value"
["fragment"]=>
string(6) "anchor"
}
string(4) "http"
string(8) "username"
string(8) "password"
string(8) "hostname"
int(9090)
string(5) "/path"
string(9) "arg=value"
string(6) "anchor"
]]>
</screen>
</example>
</para>
<para>
<example>
<title><function>parse_url</function> 解析丢失协议的示例</title>
<programlisting role="php">
<![CDATA[
<?php
$url = '//www.example.com/path?googleguy=googley';
// 在 5.4.7 之前这会输出路径 "//www.example.com/path"
var_dump(parse_url($url));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(3) {
["host"]=>
string(15) "www.example.com"
["path"]=>
string(5) "/path"
["query"]=>
string(17) "googleguy=googley"
}
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<para>
<function>parse_url</function> 是专门用来解析 URL 而不是 URI 的。不过为遵从 PHP
向后兼容的需要有个例外,对 <literal>file://</literal> 协议允许三个斜线(<literal>file:///...</literal>)。其它任何协议都不能这样。
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>pathinfo</function></member>
<member><function>parse_str</function></member>
<member><function>http_build_query</function></member>
<member><function>dirname</function></member>
<member><function>basename</function></member>
<member><link xlink:href="&url.rfc;3986">RFC 3986</link></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->