$1', $markdownText);//ぶるぶる $markdownText = preg_replace('/(^|[^`])`([^`\n]+)`($|[^`])/m', '$1$2$3', $markdownText);//Inline Code /*$markdownText = preg_replace_callback('/^\[\[time (\d+)\]\]/m', function($matches) { $timestamp = $matches[1]; return '' . date("Y/m/d H:i:s", $timestamp) . ''; }, $markdownText);*/ $markdownText = preg_replace('/\*\*\*(.*?)\*\*\*/', '$1', $markdownText);//太字&斜体の全部のせセット $markdownText = preg_replace('/\_\_\_(.*?)\_\_\_/', '$1', $markdownText);//太字&斜体の全部のせセット $markdownText = preg_replace('/\*\*(.*?)\*\*/', '$1', $markdownText);//太字 $markdownText = preg_replace('/\_\_(.*?)\_\_/', '$1', $markdownText);//太字 $markdownText = preg_replace('/\*(.*?)\*/', '$1', $markdownText);//斜体 $markdownText = preg_replace('/\_(.*?)\_/', '$1', $markdownText);//斜体 $markdownText = preg_replace('/\~\~(.*?)\~\~/m', '$1', $markdownText);//打ち消し線 $markdownText = preg_replace('/>>> (.*)/m', '$1', $markdownText);//>>> 引用 $markdownText = preg_replace('/\|\|(.*)\|\|/m', '$1', $markdownText);//黒塗り // タイトル(#、##、###)をHTMLのhタグに変換 $markdownText = preg_replace('/^# (.+)/m', '

$1

', $markdownText); $markdownText = preg_replace('/^## (.+)/m', '

$1

', $markdownText); $markdownText = preg_replace('/^### (.+)/m', '

$1

', $markdownText); // 箇条書き(-)をHTMLのul/liタグに変換 $markdownText = preg_replace('/^- (.+)/m', '

・ $1

', $markdownText); // 空行の前に何もない行をHTMLのpタグに変換 $markdownText = preg_replace('/(^\s*)(?!\s)(.*)/m', '$1

$2

', $markdownText); return $markdownText; } //Profile function replaceProfileEmojiImages($postText) { $postText = str_replace(''', '\'', $postText); // プロフィール名で絵文字名(:emoji:)を検出して画像に置き換える $emojiPattern = '/:(\w+):/'; $postTextWithImages = preg_replace_callback($emojiPattern, function($matches) { $emojiName = $matches[1]; //絵文字path取得 $dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST, DB_USER, DB_PASS, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, )); $emoji_Query = $dbh->prepare("SELECT emojifile, emojiname FROM emoji WHERE emojiname = :emojiname"); $emoji_Query->bindValue(':emojiname', $emojiName); $emoji_Query->execute(); $emoji_row = $emoji_Query->fetch(); if(empty($emoji_row["emojifile"])){ $emoji_path = "img/sysimage/errorimage/emoji_404.png"; }else{ $emoji_path = $emoji_row["emojifile"]; } return ":$emojiName:"; }, $postText); return $postTextWithImages; } // ユーズ内の絵文字やhashtagを画像に置き換える function replaceEmojisWithImages($postText) { $postText = str_replace(''', '\'', $postText); // ユーズ内で絵文字名(:emoji:)を検出して画像に置き換える $emojiPattern = '/:(\w+):/'; $postTextWithImages = preg_replace_callback($emojiPattern, function($matches) { $emojiName = $matches[1]; //絵文字path取得 $dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST, DB_USER, DB_PASS, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, )); $emoji_Query = $dbh->prepare("SELECT emojifile, emojiname FROM emoji WHERE emojiname = :emojiname"); $emoji_Query->bindValue(':emojiname', $emojiName); $emoji_Query->execute(); $emoji_row = $emoji_Query->fetch(); if(empty($emoji_row["emojifile"])){ $emoji_path = "img/sysimage/errorimage/emoji_404.png"; }else{ $emoji_path = $emoji_row["emojifile"]; } return ":$emojiName:"; }, $postText); // @username を検出してリンクに置き換える $usernamePattern = '/@(\w+)/'; $postTextWithImagesAndUsernames = preg_replace_callback($usernamePattern, function($matches) { $username = $matches[1]; $dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST, DB_USER, DB_PASS, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, )); $mentionsuserQuery = $dbh->prepare("SELECT username, userid FROM account WHERE userid = :userid"); $mentionsuserQuery->bindValue(':userid', $username); $mentionsuserQuery->execute(); $mentionsuserData = $mentionsuserQuery->fetch(); if(empty($mentionsuserData)){ return "@$username"; }else{ return "@".replaceProfileEmojiImages(htmlspecialchars($mentionsuserData["username"], ENT_QUOTES, 'UTF-8', false)).""; } }, $postTextWithImages); $hashtagsPattern = '/#([\p{Han}\p{Hiragana}\p{Katakana}A-Za-z0-9ー_]+)/u'; $postTextWithHashtags = preg_replace_callback($hashtagsPattern, function($matches) { $hashtags = $matches[1]; return "" . '#' . $hashtags . ""; }, $postTextWithImagesAndUsernames); return $postTextWithHashtags; } function replaceURLsWithLinks($postText) { // URLを正規表現を使って検出 $pattern = '/(https:\/\/[^\s<>\[\]\'"]+)/'; // 改良された正規表現 preg_match_all($pattern, $postText, $matches); // 検出したURLごとに処理を行う foreach ($matches[0] as $url) { // ドメイン部分を抽出 $parsedUrl = parse_url($url); if (!isset($parsedUrl['path'])) { $parsedUrl['path'] = ''; } if (!isset($parsedUrl['query'])) { $parsedUrl['query'] = ''; } $nochk_domain = $parsedUrl['host'].$parsedUrl['path'].$parsedUrl['query']; if(strlen($nochk_domain) > 47){ $domain = mb_substr($nochk_domain, 0, 48, "UTF-8")."..."; }else{ $domain = $nochk_domain; } // 不要な文字を削除してaタグを生成 $urlWithoutSpaces = preg_replace('/\s+/', '', $url); $link = "$domain"; // URLをドメインのみを表示するaタグで置き換え $postText = preg_replace('/' . preg_quote($url, '/') . '/', $link, $postText); } return $postText; } function YouTube_and_nicovideo_Links($postText) { // URLを正規表現を使って検出 $pattern = '/(https:\/\/[^\s<>\[\]\'"]+)/'; // 改良された正規表現 preg_match_all($pattern, $postText, $matches); if(empty($url)){ $postText = ""; } // 検出したURLごとに処理を行う foreach ($matches[0] as $url) { // ドメイン部分を抽出 $parsedUrl = parse_url($url); if($parsedUrl['host'] == "youtube.com" || $parsedUrl['host'] == "youtu.be" || $parsedUrl['host'] == "www.youtube.com" || $parsedUrl['host'] == "m.youtube.com"){ if (isset($parsedUrl['query'])) { if(false !== strpos($parsedUrl['query'], 'v=')) { $video_id = str_replace('v=', '', htmlspecialchars($parsedUrl['query'], ENT_QUOTES, 'UTF-8', false)); $iframe = true; }else{ $video_id = str_replace('/', '', htmlspecialchars($parsedUrl['path'], ENT_QUOTES, 'UTF-8', false)); $iframe = true; } }elseif(isset($parsedUrl['path'])){ $video_id = str_replace('/', '', htmlspecialchars($parsedUrl['path'], ENT_QUOTES, 'UTF-8', false)); $iframe = true; }else{ $video_id = ""; $iframe = false; } // 不要な文字を削除してaタグを生成 if($iframe == true){ $link = ''; }else{ $link = ""; } // URLをドメインのみを表示するaタグで置き換え $postText = $link; }elseif($parsedUrl['host'] == "nicovideo.jp" || $parsedUrl['host'] == "www.nicovideo.jp"){ if(isset($parsedUrl['path'])){ $video_id = str_replace('/watch/', '', htmlspecialchars($parsedUrl['path'], ENT_QUOTES, 'UTF-8', false)); $iframe = true; }else{ $video_id = ""; $iframe = false; } // 不要な文字を削除してaタグを生成 if($iframe == true){ $link = ''; } if(!($this->value['abi'] == "none")){ echo '
'; echo '
'; echo '

' . replaceProfileEmojiImages(htmlspecialchars($this->value['username'], ENT_QUOTES, 'UTF-8', false)) . 'さんが追記しました

'; echo '
'; echo '

'.processMarkdownAndWrapEmptyLines(replaceEmojisWithImages(replaceURLsWithLinks(nl2br(htmlspecialchars($this->value['abi'], ENT_QUOTES, 'UTF-8', false))))) . '

'; echo '
追記日時 : '. date("Y年m月d日 H:i", strtotime(htmlspecialchars($this->value['abidate'], ENT_QUOTES, 'UTF-8', false))) . '
'; echo '
'; } if($this->value['nsfw'] === "true"){ echo ' '; echo ' '; } echo '
'; echo '
'; $favoriteList = explode(',', $this->value['favorite']); if (in_array($this->userid, $favoriteList)) { echo ''; }else{ echo ''; } echo ''.htmlspecialchars($this->value['reply_count'], ENT_QUOTES, 'UTF-8', false).''; echo ''; $bookmarkList = explode(',', $this->value['bookmark']); if (in_array($this->value['uniqid'], $bookmarkList)) { echo ''; }else{ echo ''; } if($this->value['account'] === $this->userid){ if(!($this->value['role'] === "ice")){ if($this->value['abi'] === "none"){ echo ''; } } echo ''; } echo '
'; echo ''; } } } ?>