Players
2,262 players, all seasons
What a player page adds that a row in this list cannot
A row here is a name, a position and a club. The page behind it is a career: every season on file as its own line, with regular-season and playoff totals kept on separate rows rather than added together — which means a player's playoff record can be read on its own instead of being smuggled into his season.
Under the career table sits the part a season total structurally cannot give you — the game-by-game log, and rolling splits over the last five and last ten appearances. A season number answers what a player has produced. The splits answer whether he is producing it now, which is the question anyone actually opens a player page in January to settle. The windows cover only games he played, so a five-game split is five games and never five nights padded with the ones he sat out.
The season control on that page scopes the log and the splits, and deliberately not the career table: comparing seasons is the entire reason the career table exists. Only seasons with per-game lines collected appear in the control, which is fewer than the career table shows while older seasons are still being backfilled — a season missing from the picker is a gap in the per-game collection, not a season the player did not play.
None of it is a forecast. Every number on a player page describes production that has already happened, and nothing on the page knows he was hurt, changed line, or signed somewhere else in July.
Every filter on this page is an address
The position chips, the status chips and the club selector all change the URL and re-render on the server. That makes each one shareable, bookmarkable, crawlable, and functional with JavaScript switched off — the list of every current defenceman on a club is a link you can send someone, not a state you have to describe to them.
The page number is dropped whenever a filter changes, on purpose. Page four of the defencemen is not page four of the goaltenders; carrying the number across would land you in the middle of a list you have just started, or past the end of a shorter one, with nothing on screen to say anything had been skipped.
Typing in the search field puts the page into a different mode rather than narrowing the one you were in. Browsing walks an alphabetical index one page at a time; searching ranks the whole table against your term and returns the closest matches in one shot. The status control disappears while you are searching because search already reaches every player ever recorded here — a control that could only narrow that would hide the retired player whose name you just typed.
Why the club beside a name is today's club, and why most all-time rows have none
The club shown here is the one the player is on now. It is not the club a past season's numbers happened at, and on this site those are answered by different mechanisms: the directory reads the current roster, while a stat line is attributed to a club using dated spells derived from the games the player actually appeared in. For anyone traded in the last decade the two disagree, and only one of them is a claim about the season you are reading.
The default view lists players on an NHL roster today. All-time reaches back through every season the site holds, and almost everything it adds is a player who exists here only because he turned up in a season summary — the ingest writes a row for anyone with a stat line who is on no roster, so ten seasons of departures sit in the table beside this morning's rosters.
Those rows are thinner than they look, and knowingly so. A player recorded from a stat line carries a name, a position and his statistics; his date of birth, height, weight and shooting hand are absent, because the report he came from never carried them. His page shows an em dash where a current player shows a number. That dash is a statement about what the source contained, not a value of zero and not a rendering fault.
One practical consequence: combining the all-time view with a club filter adds almost nothing, because the rows all-time adds are precisely the ones with no club to match against. To see who played for a club in a particular season, start from that season on a player's page rather than from this filter.
How the search box decides which Smith comes first
Matching is on any part of the name, because the useful query for a hockey name is usually neither the whole thing nor its beginning — people type “mcdavid”, not “connor mcdavid”. A plain contains-match ranks by nothing at all, though: it would put a player whose name merely contains your letters somewhere above the one whose surname is exactly what you typed, whenever the alphabet happened to say so. So matches are sorted into four tiers before anything else is considered.
Inside every tier, current players sort above former ones. Ten seasons of history means a common surname returns a dozen people, most of whom left the league years ago, and the one still playing is nearly always the one being looked for. It is a tiebreak and never a filter — everyone who matched is still in the list, further down.
Relevance ordering has one consequence worth stating: results are capped rather than paginated. A list sorted by how well the name matches has no useful second page, so the cap is where the ordering stops being informative rather than an arbitrary ceiling — which is why adding a letter finds a player and paging would not.
How a search term is ranked, tier by tier
Applied in order: a match falls into the first tier it qualifies for. Within a tier, players active today sort above former ones, and anything still level is broken alphabetically.
| Order | What matches | Example |
|---|---|---|
| 1 | The whole name, ignoring case | “connor mcdavid” puts Connor McDavid first |
| 2 | The name starts with the term | “connor” reaches every Connor in the league |
| 3 | A word inside the name starts with the term — a surname, or either half of a hyphenated one | “mcdavid” finds him by surname; “luc” finds Pierre-Luc Dubois |
| 4 | The term appears anywhere else in the name | “avid” still finds McDavid, below everything matched above |
Questions about this directory
Why does searching for an NHL player's name without accents find nothing?
- Player search matches the stored name literally, accents included, so an unaccented spelling of a name that carries a non-ASCII character matches nobody. The way around it is to type only the part of the name before the accented letter and stop — “lafren” finds Alexis Lafrenière where “lafreniere” finds no one — or to reach the player from his club's roster instead. It affects a small share of players, and it is a known limitation of the current matching rather than a gap in the data: the player's page, statistics and rankings all exist and are reachable every other way.
Does the player search on NHL Fantasy Hub include retired players?
- Yes, and it does so whatever the Current or All-time control is set to — that control governs browsing only, and search deliberately ignores it. Hiding a player from someone who has typed his name would make the site look as though it had never heard of him, so every player with a stat line on record, ten seasons back, is reachable by name. Players active today are ranked above former ones among equally good matches, so a common surname still puts the man playing now at the top of the list.
Why do player search results stop at fifty?
- Because results are ordered by how closely the name matches rather than alphabetically, which makes a second page nearly worthless: by the fiftieth match the name merely contains the letters somewhere. Adding one more letter finds a specific player faster than paging ever would, and the page says so when it has reached the cap. Every player is also reachable without searching, by filtering the directory on position and club or by opening his club's roster.