2

ハッシュタグをサポートするフォーラムがあります。次の行を使用して、すべてのハッシュタグをリンクに変換しています。このパターンを使用して(^|\(|\s|>)、URL 内の名前付きアンカーを拾わないようにしています。

$str=preg_replace("/(^|\(|\s|>)(#(\w+))/","$1<a href=\"/smalltalk.php?Tag=$3&amp;".SID."\">$2</a>",$str);

この行を使用してハッシュタグを取得し、ユーザーがメッセージを投稿するときに別のフィールドに保存します。これにより、新しい行の先頭にあるハッシュタグを除くすべてのハッシュタグが取得されます。

preg_match_all("/(^|\(|\s|>)(#(\w+))/",$Content,$Matches);

m&修飾子を使用しsても違いはありません。2番目のインスタンスで何が間違っていますか?

編集: 入力テキストはプレーンテキストまたは HTML です。問題の入力例:

#startoftextreplacesandmatches #afterwhitespacereplacesandmatches <b>#insidehtmltagreplacesandmatches</b> :)
#startofnewlinereplacesbutdoesnotmatch :(
4

1 に答える 1

2

あなたの置換操作には、明らかにまだ遭遇していない問題があります - エスケープされていない HTML 特殊文字が許可されます。私がこれを知っている理由は、あなたの正規表現では、ハッシュタグに>特殊文字である をプレフィックスとして付けることができるためです。

そのため、このコードを使用して置換を行うことをお勧めします。これは、データベースに挿入されるタグを抽出するためのコードとしても機能します。

$hashtags = array();

$expr = '/(?:(?:(^|[(>\s])#(\w+))|(?P<notag>.+?))/';

$str = preg_replace_callback($expr, function($matches) use (&$hashtags) {
    if (!empty($matches['notag'])) {
        // This takes care of HTML special characters outside hashtags
        return htmlspecialchars($matches['notag']);
    } else {
        // Handle hashtags
        $hashtags[] = $matches[2];
        return htmlspecialchars($matches[1]).'<a href="/smalltalk.php?Tag='.htmlspecialchars(urlencode($matches[2])).'&amp;'.SID.'">#'.htmlspecialchars($matches[2]).'</a>';
    }
}, $str);

上記のコードが実行$strされると、変更された文字列が含まれ、直接出力用に適切にエスケープされ、$hashtags一致したすべてのタグが入力されます。

動いているのを見る

于 2012-09-02T15:14:46.897 に答える