In computer hypertext, a URI fragment is a string of characters that refers to a resource that is subordinate to another, primary resource. The primary resource is identified by a Uniform Resource Identifier (URI), and the fragment identifier points to the subordinate resource.
The fragment identifier introduced by a hash mark
# is the optional last part of a URL for a document. It is typically used to identify a portion of that document. The generic syntax is specified in RFC 3986. The hash-mark separator in URIs is not part of the fragment identifier.
In URIs, a hash mark
# introduces the optional fragment near the end of the URL. The generic RFC 3986 syntax for URIs also allows an optional query part introduced by a question mark
?. In URIs with a query and a fragment, the fragment follows the query. Query parts depend on the URI scheme and are evaluated by the server--e.g.,
http: supports queries unlike
ftp:. Fragments depend on the document MIME type and are evaluated by the client (web browser). Clients are not supposed to send URI fragments to servers when they retrieve a document, and without help from a local application (see below) fragments do not participate in HTTP redirections.
A URI ending with
# is permitted by the generic syntax and is a kind of empty fragment. In MIME document types such as
text/html or any XML type, empty identifiers to match this syntactically legal construct are not permitted. Web browsers typically display the top of the document for an empty fragment.
The fragment identifier functions differently to the rest of the URI: its processing is exclusively client-sided with no participation from the web server, though the server typically helps to determine the MIME type, and the MIME type determines the processing of fragments. When an agent (such as a web browser) requests a web resource from a web server, the agent sends the URI to the server, but does not send the fragment. Instead, the agent waits for the server to send the resource, and then the agent processes the resource according to the document type and fragment value.
In an HTML web page, the agent will look for an anchor identified with an HTML tag that includes an
name= attribute equal to the fragment identifier.
text/htmlpages such as
http://www.example.org/foo.html#barthe fragment refers to the element with
#:~:text=foowill cause the browser to search for
foo, highlight the matching text, and scroll to it. Besides the start and end, the snippet can also specify a context: text that must precede or follow
foobut won't be highlighted (example that searches for 'vision' preceded by 'night').
:targetCSS pseudoclass; Wikipedia uses this to highlight the selected reference. Notably CSS
display: blockcan be used to show content only if it is the target, and otherwise hidden by
nameattribute (allowed only for some elements) had a similar purpose in now obsolete browsers. If present
idmust be identical.
idattributes follow the
Name-syntax and begin with a letter, underscore, or colon. Notably they cannot begin with a digit or hyphen.
xml:idis one of the few generic XML attributes, e.g.,
xml:lang, which can be used without explicitly declaring a namespace. In XHTML
idhas to be used, because XHTML was specified before
http://www.example.org/foo.xml#xpointer(//Rube)refers to all XML elements named "Rube" in the document identified by the URI http://www.example.org/foo.xml. An XPointer processor, given that URI, would obtain a representation of the document (such as by requesting it from the Internet) and would return a representation of the document's "Rube" elements.
http://www.w3.org/2004/02/skos/core#broaderidentifies the concept "broader" in SKOS Core vocabulary, but it does not refer to a specific part of the resource identified by
http://www.w3.org/2004/02/skos/core, a complete RDF file in which semantics of this specific concept is declared, along with other concepts in the same vocabulary.
text/plaindocuments RFC 5147 specifies a fragment identifier for the character and line positions and ranges within the document using the keywords "
char" and "
line". Browser support seems lacking. The following example identifies lines 11 through 20 of a text document:
text/csvdocuments, RFC 7111 specifies a fragment identifier as a selector for rows, columns, and cells using the keywords "
row" , "
col", and "
cell", for example:
http://example.com/data.csv#row=4- Selects the 4th row.
http://example.com/data.csv#col=2- Selects 2nd column.
http://example.com/data.csv#row=5-7- Selects three consecutive rows starting with 5th row.
http://example.com/data.csv#row=5-*- Selects all rows starting with 5th row.
http://example.com/data.csv#cell=4,1-6,2- Selects a region that starts at the 4th row and the 1st column and ends at the 6th row and the 2nd column.
xywh. Therefore, one can use the following media fragments URI in the
srcattribute of the
#01h25m30sto start playing at the specified position, and YouTube uses similar code such as
application/pdfdocuments PDF viewers recognize a number of fragment identifiers. For instance, a URL ending in
.pdf#page=35will cause most readers to open the PDF and scroll to page 35. Several other parameters are possible, including
#nameddest=(similar to HTML anchors),
#zoom=, etc. Multiple parameters can be combined with ampersands:
Several proposals have been made for fragment identifiers for use with plain text documents (which cannot store anchor metadata), or to refer to locations within HTML documents in which the author has not used anchor tags:
https://pypi.python.org ... zodbbrowser-0.3.1.tar.gz#md5=38dc89f294b24691d3f0d893ed3c119c
!. It was used in a now-deprecated approach to index dynamic single-page applications. An exclamation mark is illegal in HTML4 (but not in HTML5), XHTML, and XML identifiers, granting certain degree of separation from that functionality.
#!s!search terms. Adding a number after the s (
#!s10!) indicates that the browser should search for the nth occurrence of the search term. A negative number (
#!s-3!) starts searching backwards from the end of the document. A Greasemonkey script is available to add this functionality to compatible browsers.
match". They also describe a prototype implementation as an extension for the Firefox browser. For example, the following would find the case-insensitive text "RFC" anywhere in the document:
words" is the first proposal in this scheme. The following example would search a document for the first occurrence of the string "some context for a search term" and then highlight the words "search term":
#FWS+C, where F is the length of the first word (up to five characters), W is the first word itself, S is the length of the selected text and C is a 32-bit CRC of the selected text. They implemented a variant of this scheme as an extension for the Firefox browser, using the form
#LFWS+C, where L is the length of the fragment itself, in two hex digits. Linking to the word "Fragment" using the implemented variant would yield:
Pypi has the habit to append an md5 fragment to its egg urls, we'll use it to check the already present distribution files in the cache