数字だけとかカラーコードを除外してハッシュタグをピックアップする

 WorPressのプラグインActivityPubでは日本語のハッシュタグを文章からピックアップしてくれないから、ピックアップしてもらうようにするための方法を前回書いた。

 でも、それだけでなく、マストドンと同じように数字だけのハッシュタグを除外した方が良いし、カラーコードのようにハッシュ # で始まってセミコロン ; で終わる場合も除外した方が良い。そのための正規表現と、その動作を確認するためのphpコードをGeminiに作ってもらった。

// 日本語対応・安全装置付き正規表現
// ポイント:
// 1. (?![\d\p{P}]+(?:\s|[[:punct:]]|$)) : 数字と記号のみの構成を拒否
// 2. ((?:[^\s\p{P}\p{S}]|_)+) : タグ本体(日本語を含む)
// 3. (?![^#\s]*;) : タグの塊の「直後」にセミコロンがあることを許さない
// 4. (?=\s|[\p{P}\p{S}]|$) : 境界の再確認
$pattern = '/(?<=^|\s|<p>|<br>)#(?![\d\p{P}]+(?:\s|$))((?:[^\s\p{P}\p{S}]|_)+)(?![^#\s]*;)(?=\s|[\p{P}\p{S}]|$)/u';

defined( 'ACTIVITYPUB_HASHTAGS_REGEXP' ) || define( 'ACTIVITYPUB_HASHTAGS_REGEXP', $pattern );

// テスト用長文(CSSコードを現実に即した形式に修正)
$text = <<<EOT
<p>#ActivityPub のテスト。 #WordPress や #日本語ハッシュタグ は抽出対象です。</p>

サイトのデザイン設定(CSS):
.header {
    background-color: #ffffff; /* セミコロンがあるので除外されるべき */
    color: #f00;              /* セミコロンがあるので除外されるべき */
    border: 1px solid #000;   /* セミコロンがあるので除外されるべき */
}

目標とスケジュール:
#2026年 も #365days 頑張りましょう。
しかし、単なる数字の #2026 や #12345 はタグではありません。

文章内の記号と日本語の混在:
今日は #散歩、明日は #読書。そして #成功!
(注意: #apple; はセミコロンがあるので除外されます)

混合タグの例:
#Japan2026 や #2026vision は抽出されます。
#Japan_2026 や #ActivityPub_Plugin は抽出されます。
括弧がある場合(#2025年)は抽出されません。
EOT;

// マッチング実行
preg_match_all(ACTIVITYPUB_HASHTAGS_REGEXP, $text, $matches);

// 結果表示
echo "--- 抽出されたハッシュタグ一覧 ---\n";
if (!empty($matches[1])) {
    foreach ($matches[1] as $index => $tag) {
        echo sprintf("%02d: #%s\n", $index + 1, $tag);
    }
}

$found_tags = $matches[1];
echo "\n--- 論理チェック結果 ---\n";
echo "【成功】日本語 (#日本語ハッシュタグ) : " . (in_array('日本語ハッシュタグ', $found_tags) ? "Yes" : "No") . "\n";
echo "【成功】日本語+数字 (#2026年) がある: " . (in_array('2026年', $found_tags) ? "Yes" : "No") . "\n";
echo "【成功】アンダースコアを含む (#ActivityPub_Plugin) : " . (in_array('ActivityPub_Plugin', $found_tags) ? "Yes" : "No") . "\n";
echo "【成功】括弧がある場合 (#2025年) の除外 : " . (!in_array('2025年', $found_tags) ? "Yes" : "No") . "\n";
echo "【成功】CSSカラー (#ffffff) の除外 : " . (!in_array('ffffff', $found_tags) ? "Yes" : "No") . "\n";
echo "【成功】数字のみ (#2026) の除外 : " . (!in_array('2026', $found_tags) ? "Yes" : "No") . "\n";
echo "【成功】セミコロン付き (#apple) の除外 : " . (!in_array('apple', $found_tags) ? "Yes" : "No") . "\n";

 結果は次の通り。

--- 抽出されたハッシュタグ一覧 ---
01: #ActivityPub
02: #WordPress
03: #日本語ハッシュタグ
04: #2026年
05: #365days
06: #散歩
07: #読書
08: #成功
09: #Japan2026
10: #2026vision
11: #Japan_2026
12: #ActivityPub_Plugin

--- 論理チェック結果 ---
【成功】日本語 (#日本語ハッシュタグ) : Yes
【成功】日本語+数字 (#2026年) がある: Yes
【成功】アンダースコアを含む (#ActivityPub_Plugin) : Yes
【成功】括弧がある場合 (#2025年) の除外 : Yes
【成功】CSSカラー (#ffffff) の除外 : Yes
【成功】数字のみ (#2026) の除外 : Yes
【成功】セミコロン付き (#apple) の除外 : Yes
未分類
管理人のマストドンアカウントへのリンクなど

コメント

  1. ishii ishii より:

    括弧がある場合(#2025年)ではなく、( #2025年)にすれば、#2025年 がピックアップされる。

タイトルとURLをコピーしました