2

ええと、私は過去10時間以上インターネットを検索してきましたが、これに関しては運も成功もありませんでした。

irc制御コード(色など)をhtmlに変換しようとしています。これは、eggdroptclバインドイベントから取得した入力テキストです。太字/下線は正常に機能します。イタリックはまだテストされていませんが、問題はありません。

..問題は、私の正規表現が間違った文字と一致しているように見えることです。\003(\d+)[,]?(\d*)(.*?)正規表現を設定しました-コーディング(主にphp / js)の以前の経験からの知識があると想定しました-制御文字の後の数字が必要なため、リストのインデックスとして使用するために、と照合します。必要なhtmlの16進色を引き出します。ただし、プルされる数字は、端末に正しく表示されない数字でさえないように見え、代わりに制御文字であるように見えます(geditを使用した私の経験から)。

私のプロセスのコードは以下のとおりです。これは、テキストをファイルに記録する、より大きなスクリプトの一部です。他のすべては機能しますが、このプロセスです。

質問に..私はここで正確に何を間違えましたか?私が受け取った唯一のエラーメッセージは、「(制御文字)無効なインデックス」に似たものです。

proc logger:control {text} {

    set val {
        {FFF}
        {000}
        {00007F}
        {009000}
        {FF0000}
        {7F0000}
        {9F009F}
        {FF7F00}
        {FFFF00}
        {00F800}
        {00908F}
        {00FFFF}
        {0000FF}
        {FF00FF}
        {7F7F7F}
        {CFD0CF}
    }

    while {[regsub {\002(.*?)\002} $text {<b>\1</b>} text]} {}
    while {[regsub {\037(.*?)\037} $text {<u>\1</u>} text]} {}
    while {[regsub {\035(.*?)\035} $text {<i>\1</i>} text]} {}
    while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text "</span><span style='color: [lindex $val \1] ;'>\3" text]} {}
    # ^ the line that throws the error
    while {[regsub {\003[^\d]} $text {$text</span>} text]} {}

    return $text
}
4

1 に答える 1

2

あなたが言うように、問題はこの行です:

while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text "</span><span style='color: [lindex $val \1] ;'>\3" text]} {}

それに関する最初の問題は、二重引用符で引用したように、 Tclが\digit置換をすぐに解釈していることです。修正?中かっこを使用します。""

while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text {</span><span style='color: [lindex $val \1] ;'>\3} text]} {}

2番目の問題は、その後、テキストに文字通りのTclコマンドフラグメントが含まれることです。おそらくあなたが望むものではありません!残念ながら、/eここにはPerlのフラグのようなものはありません。まったく異なるアプローチが必要です。

# First, defang any Tcl metacharacters
set text [string map {\\ \\\\ [ \\[ ] \\] $ \\$} $text]
# Second, do the replacements, inserting Tcl fragments
while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text {</span><span style='color: [lindex $val \1] ;'>\3} text]} {}
# Third, do the substitutions we just inserted
set text [subst $text]

このトリックを使用するときは、REが余分な円記号を考慮に入れるように注意する必要があることに注意してください。ありがたいことに、あなたの場合、パターンがバックスラッシュと一致しないため、違いはありません。

于 2013-02-16T17:35:14.583 に答える