")) { $highlighted = '' . nl2br(htmlentities($code, ENT_HTML5), false) . ""; } // Fix output to use CSS classes and wrap well $highlighted = '
' . strtr( $highlighted, [ ' ' => ' ', "\n" => '', ''; if ($return) { return $highlighted; } echo $highlighted; return null; } // Same as highlight_php() but does not require ')+!", '', $highlighted_code, 1); if ($return) { return $highlighted_code; } echo $highlighted_code; return null; } // Resize the image using the output of make_image() function resize_image($img, $width = 1, $height = 1) { // Drop width and height values from image if available $str = preg_replace('!width=\"([0-9]+?)\"!i', '', $img); $str = preg_replace('!height=\"([0-9]+?)\"!i', '', $str); // Return image with new width and height added return preg_replace( '!/?>$!', sprintf(' height="%s" width="%s">', $height, $width), $str, ); } // Return an tag for a given image file available on the server function make_image($file, $alt = false, $align = false, $extras = false, $dir = '/images', $addsize = false) { // If no / was provided at the start of $dir, add it $webdir = $_SERVER['MYSITE'] . ($dir[0] == '/' ? '' : '/') . $dir; // Get width and height values if possible if ($addsize && ($size = @getimagesize($_SERVER['DOCUMENT_ROOT'] . "$dir/$file"))) { $sizeparams = ' ' . trim($size[3]); } else { $sizeparams = ''; } // Convert right or left alignment to CSS float, // but leave other alignments intact (for now) if (in_array($align, ["right", "left"], true)) { $align = ' style="float: ' . $align . ';"'; } elseif ($align) { $align = ' align="' . $align . '"'; } else { $align = ''; } // Return with image built up return sprintf('%s', $webdir, $file, ($alt ?: ''), $sizeparams, $align, ($extras ? ' ' . $extras : ''), ); } // Print an tag out for a given file function print_image($file, $alt = false, $align = false, $extras = false, $dir = '/images'): void { echo make_image($file, $alt, $align, $extras, $dir); } // Shortcut to usual news image printing (right floating // image from the news dir with an alt and an URL) function news_image($URL, $image, $alt, $print = true) { $str = "" . make_image("news/$image", $alt, "right") . ""; if ($print) { echo $str; } return $str; } // Return HTML code for a submit button image function make_submit($file, $alt = false, $align = false, $extras = false, $dir = '/images', $border = 0) { // Get an image without size info and convert the // border attribute to use CSS, as border="" is not // supported on elements in [X]HTML $img = make_image($file, $alt, $align, $extras, $dir, false); $img = str_replace( "border=\"$border\"", "style=\"border: {$border}px;\"", $img, ); // Return with ready input image return '%s", $url, $linktext ?: $url); } // make_popup_link() // return a hyperlink to something, within the site, that pops up a new window // function make_popup_link($url, $linktext = false, $target = false, $windowprops = "", $extras = false) { return sprintf("%s", htmlspecialchars($url, ENT_QUOTES | ENT_IGNORE), ($target ?: "_new"), htmlspecialchars($url, ENT_QUOTES | ENT_IGNORE), ($target ?: "_new"), $windowprops, ($extras ? ' ' . $extras : ''), ($linktext ?: $url), ); } // Print a link for a downloadable file (including filesize) function download_link($file, $title): void { $download_link = "/distributions/" . $file; // Print out the download link echo make_link($download_link, $title); // We have a full path or a relative to the distributions dir if ($tmp = strrchr($file, "/")) { $local_file = substr($tmp, 1, strlen($tmp)); } else { $local_file = "distributions/$file"; } if (@file_exists($local_file . ".asc")) { echo " "; $sig_link = "/distributions/$file.asc"; echo make_link($sig_link, "(sig)"); } // Try to get the size of the file $size = @filesize($local_file); // Print out size in bytes (if size is // less then 1Kb, or else in Kb) if ($size) { echo ' ['; if ($size < 1024) { echo number_format($size) . 'b'; } else { echo number_format($size / 1024) . 'Kb'; } echo ']'; } } function clean($var) { return htmlspecialchars($var, ENT_QUOTES); } // Clean out the content of one user note for printing to HTML function clean_note($text) { // Highlight PHP source $text = highlight_php(trim($text), true); // Turn urls into links return preg_replace( '!((mailto:|(https?|ftp|nntp|news)://).*?)(\s|<|\)|"|\\\\|\'|$)!', '\1\4', $text, ); } function display_errors($errors): void { echo '
'; if (count($errors) > 1) { echo "You need to do the following before your submission will be accepted:
    "; foreach ($errors as $error) { echo "
  • $error
  • \n"; } echo "
"; } else { echo $errors[0]; } echo '
'; } // Displays an event. Used in event submission // previews and event information displays function display_event($event, $include_date = 1): void { global $COUNTRIES; // Current month (int)($_GET['cm'] ?: 0) global $cm; // Current year (int)($_GET['cy'] ?: 0) global $cy; // Weekday names array for ($i = 1; $i <= 7; $i++) { $days[$i] = date('l', mktime(12, 0, 0, 4, $i, 2012)); } // Recurring possibilities $re = [ 1 => 'First', 2 => 'Second', 3 => 'Third', 4 => 'Fourth', -1 => 'Last', -2 => '2nd Last', -3 => '3rd Last', ]; if (!isset($event['start']) && isset($event['sday'])) { $sday = mktime(12,0,0,$event['smonth'],$event['sday'],$event['syear']); } else { $sday = (isset($event['start']) && !empty($event['start'])) ? strtotime($event['start']) : 0; } if (!isset($event['end']) && isset($event['eday'])) { $eday = mktime(12,0,0,$event['emonth'],$event['eday'],$event['eyear']); } else { $eday = (isset($event['end']) && !empty($event['end'])) ? strtotime($event['end']) : 0; } ?>
", date("F j, Y", $sday), "\n"; } // Print link in case we have one if ($event['url']) { echo ''; } // Print event description echo "", stripslashes(htmlentities($event['sdesc'], ENT_QUOTES | ENT_IGNORE, 'UTF-8')), ""; // End link if ($event['url']) { echo ""; } // Print extra date info for recurring and multiday events switch ($event['type']) { case 2: case 'multi': $dtend = date("Y-m-d", strtotime("+1 day", $eday)); echo " (", date("Y-m-d",$sday), " to ", date("Y-m-d",$eday), ")"; break; case 3: case 'recur': $days = $re[$event['recur']] . " " . $days[$event['recur_day']]; if (!$cm || $cy) { $cm = date("m"); $cy = date("Y"); } $month = date("M", mktime(0, 0, 0, $cm, 1, $cy)); $dtstart = date("Y-m-d", strtotime($days . ' 0st' . $month . ' ' . $cy)); echo ' (Every ', $days, " of the month)"; break; } // Event category if (isset($event['category']) && $event['category']) { $cat = ["unknown", "User Group Event", "Conference", "Training"]; echo ' [' . $cat[$event['category']] . '] '; } // Print out country information echo ' (' , $COUNTRIES[$event['country']] , ')'; ?>

", trim(htmlentities($event['ldesc'],ENT_QUOTES | ENT_IGNORE, 'UTF-8'))); // If we have an URL, print it out if ($event['url']) { echo '

URL: ', '', htmlentities($event['url'], ENT_QUOTES | ENT_IGNORE, 'UTF-8'), ''; } ?>
Archives by year '; for ($i = date("Y"); $i >= 1998; $i--) { $pagename = "archive/$i.php"; $classname = ($pagename == $_SERVER['BASE_PAGE'] ? " active" : ''); $SIDEBAR_DATA .= "

{$i}

\n"; } } // Print news function print_news($news, $dog, $max = 5, $onlyyear = null, $return = false) { $retval = []; $count = 0; $news = $news ?: []; // default to empty array (if no news) foreach ($news as $item) { $ok = false; // Only print entries in the provided s/dog/cat/ egory // If $dog is null, everything matches foreach ($item["category"] as $category) { if (null === $dog || in_array($category["term"], (array)$dog, true)) { $ok = true; $count++; break; } } if ($count > $max) { break; } if ($ok === false) { continue; } $image = ""; if (isset($item["newsImage"])) { $image = news_image($item["newsImage"]["link"], $item["newsImage"]["content"], $item["newsImage"]["title"], false); } $id = parse_url($item["id"]); $id = $id["fragment"]; // Find the permlink foreach ($item["link"] as $link) { if ($link["rel"] === "via") { $permlink = $link["href"]; break; } } if (!isset($permlink)) { $permlink = "#" . $id; } $published = substr($item["published"], 0, 10); $nixtimestamp = strtotime($published); $newsdate = date("d M Y", $nixtimestamp); if ($onlyyear && date("Y", $nixtimestamp) != $onlyyear) { $count--; continue; } if ($return) { $retval[] = [ "title" => $item["title"], "id" => $id, "permlink" => $permlink, "date" => $newsdate, ]; continue; } echo <<
{$image}

{$item["title"]}

{$item["content"]}
EOT; } return $retval; } function site_header(string $title = 'Hypertext Preprocessor', array $config = []): void { global $MYSITE, $LANG; $meta_image_path = $MYSITE . 'images/meta-image.png'; $meta_description = "PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world."; $defaults = [ "lang" => $LANG, "current" => "", "meta-navigation" => [], 'classes' => '', 'layout_span' => 9, "cache" => false, "headsup" => "", 'meta_tags' => << META ]; $config = array_merge($defaults, $config); $config["headsup"] = get_news_changes(); $lang = (new Languages())->convert($config["lang"]); $curr = $config["current"]; $classes = $config['classes']; if (isset($_COOKIE["MD"]) || isset($_GET["MD"])) { $classes .= "markdown-content"; $config["css_overwrite"] = ["/styles/i-love-markdown.css"]; } // shorturl; http://wiki.snaplog.com/short_url if (isset($_SERVER['BASE_PAGE']) && $shortname = get_shortname($_SERVER["BASE_PAGE"])) { $shorturl = "https://www.php.net/" . $shortname; } require __DIR__ . "/header.inc"; } function site_footer(array $config = []): void { require __DIR__ . "/footer.inc"; } function get_nav_items(): array { return [ new NavItem( name: 'Downloads', href: '/downloads.php', id: 'downloads', ), new NavItem( name: 'Documentation', href: '/docs.php', id: 'docs', ), new NavItem( name: 'Get Involved', href: '/get-involved.php', id: 'community', ), new NavItem( name: 'Help', href: '/support.php', id: 'help', ), new NavItem( name: 'PHP 8.4', href: '/releases/8.4/index.php', id: 'php8', image: '/images/php8/logo_php8_4.svg', ) ]; } function get_news_changes() { include __DIR__ . "/pregen-news.inc"; $date = date_create($NEWS_ENTRIES[0]["updated"]); if (isset($_COOKIE["LAST_NEWS"]) && $_COOKIE["LAST_NEWS"] >= $date->getTimestamp()) { return false; } /* It is a bug when this happens.. but I don't know where it is coming from */ if (!isset($_SERVER["BASE_PAGE"])) { return false; } if ($_SERVER["BASE_PAGE"] == "index.php") { return false; } $date->modify("+1 week"); if ($date->getTimestamp() > $_SERVER["REQUEST_TIME"]) { $link = preg_replace('~^(http://php.net/|https://www.php.net/)~', '/', $NEWS_ENTRIES[0]["link"][0]["href"]); $title = $NEWS_ENTRIES[0]["title"]; return "{$title}"; } return false; } function doc_toc($lang): void { $file = __DIR__ . "/../manual/$lang/toc/index.inc"; if (!file_exists($file)) { $lang = "en"; // Fallback on english if the translation doesn't exist $file = __DIR__ . "/../manual/en/toc/index.inc"; } require __DIR__ . "/../manual/$lang/toc/index.inc"; echo "
\n"; doc_toc_list($lang, $TOC, "getting-started"); doc_toc_list($lang, $TOC, "langref"); echo "
\n"; echo "
\n"; doc_toc_list($lang, $TOC, "security"); doc_toc_list($lang, $TOC, "features"); echo "
\n"; echo "
\n"; doc_toc_list($lang, $TOC, "funcref"); echo "
\n"; echo "
\n"; echo "
Keyboard Shortcuts
"; echo "
?
\n"; echo "
This help
\n"; echo "
j
\n"; echo "
Next menu item
\n"; echo "
k
\n"; echo "
Previous menu item
\n"; echo "
g p
\n"; echo "
Previous man page
\n"; echo "
g n
\n"; echo "
Next man page
\n"; echo "
G
\n"; echo "
Scroll to bottom
\n"; echo "
g g
\n"; echo "
Scroll to top
\n"; echo "
g h
\n"; echo "
Goto homepage
\n"; echo "
g s
\n"; echo "
Goto search
(current page)
\n"; echo "
/
\n"; echo "
Focus search box
\n"; echo "
"; } function doc_toc_list($lang, $index, $file): void { include __DIR__ . "/../manual/$lang/toc/$file.inc"; doc_toc_title($lang, $index, $file); foreach ($TOC as $entry) { echo "\t
{$entry[1]}
\n"; } } function doc_toc_title($lang, $index, $file, $elm = "dt"): void { foreach ($index as $entry) { if ($entry[0] == "$file.php") { $link = $entry[0]; $title = $entry[1]; break; } } echo "<$elm>$title\n"; }