2016-12-21 14 views
1

現在、一致するテキストを太字のhtml行に変換する方法を探しています。私は元の文字列を維持したいが、元の文字列を比較したくないので、私に問題を与える特殊文字を除いて部分的に動作させる。特殊文字を無視して部分文字列を一致させて置換する

例:

Taco John's is my favorite place to eat. 

と望むが一致する:

Taco John's <b>is my favorite</b> place to eat. 

方法I:

is my 'favorite' 

は、望ましい結果を得るために、元の文字列が与えられ

現在m一致する文字列に余分な引用符の周りetting、私はすべての句読点を失うことを除いて、これはほとんど機能し、彼らに

let regex = new RegExp('('+escapeRegexCharacters(matching_text.replace(/[^a-z 0-9]/gi,''))+')',"gi") 
let html= full_text.replace(/[^a-z 0-9]/gi,'').replace(regex, "<b>$1</b>")}}></span> 

を置き換えることである:

Taco Johns <b>is my favorite</b> place to eat 

を正規表現を使用する方法、または別の方法があり、一致するプロセス中に大文字と小文字の両方を無視して一致するフレーズを囲むタグを追加するには?

UPDATE#1:

私が不明確であることだと思われます。最終結果のHTMLに残すには、元の文字列のpuncuationが必要です。そして、すべての特殊文字と大文字小文字を無視するために、一致するテキストロジックが必要です。したがって、is my favoriteis My favoriteis my 'favorite'はすべて一致する必要があります。パターンがある場合

+0

あなたが提供してきた正規表現の全体のポイントではない何でも「AZ」を削除することです:あなたはjavascriptのは、結果のテキストを操作することができるように代用機能であることを使用することができます(スペース)または数字です。したがって、あなたの句読点を削除するだけです:https://regex101.com/r/M9HrNF/1 –

+0

正規表現文字をエスケープすると、なぜ英数字+スペースを削除する必要がありますか? – Scimonster

+0

@DoTheDew今のところ、一致を得るために句読点を削除していますが、最終結果に句読点を残したいと思いますが、特殊文字を削除するロジックが一致しています。 –

答えて

1

代わりのから特殊文字を削除します文字列が検索されている場合、発生する可能性のある任意の特殊文字をスキップする各文字対のパターンを正規表現に挿入できます。あなたが検索される文字列に直接適用することができる正規表現を構築し、交換作業は、このように試合の外の特殊文字には触れません。その方法:

let escapeRegexCharacters = 
 
     s => s.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), 
 
    full_text = "Taco John's is My favorite place to eat."; 
 
    matching_text = "is my 'favorite'"; 
 
    regex = new RegExp(matching_text.replace(/[^a-z\s\d]/gi, '') 
 
       .split().map(escapeRegexCharacters).join('[^a-z\s\d]*'), "gi"), 
 
    html = full_text.replace(regex, "<b>$&</b>"); 
 

 
console.log(html);

+0

これはほぼ正確に正しいです。ただし、大文字と小文字が一致しないと失敗します。だから、もしmatching_textが "私のお気に入り"であれば一致しませんが、私はそれが必要です。それで、私が 'i'フラグを使用していたのは、あなたの文字マッチング方法を使うことが可能なのでしょうか? –

+0

Adapted: 'new RegExp()'に 'gi'引数を追加しました。 – trincot

+0

私は間違った場所に 'gi'フラグを追加しようとしました。ありがとうございました!これはとても賢かったです。 –

1

正規表現は有用であるが、この場合には、あなたは直接試合を持っているので、良いアプローチはString.prototype.replaceを使用している:

少なくとも
function wrap(source, part, tagName) { 

    return source 
    .replace(part, 
     `<${tagName}>${part}</${tagName}>` 
    ) 
    ; 
} 

がある場合あなたの質問を編集して提出する必要があります。

+0

replaceは完全一致の特殊文字を除いて、それは本当です。 "part"変数の余分な一重引用符があるため、置き換え( "私のお気に入り"、 "何でもいいですか?)"は動作しません。 –

0

それは「全体マッチした部分文字列」を意味$& replacement string付きキャプチャグループ、使用を回避することが可能です:(。obarakonの回答に基づいてコード)

var phrase = "Taco John's is my favorite place to eat." 
var matchingText = "is my favorite" 

var re = new RegExp(escapeRegexCharacters(matchingText), "ig"); 
phrase.replace(re, "<b>$&</b>"); 

0

一般化、正規表現ではis my /w+を使うことができます。

var str = "Taco John's is my favorite place to eat."; 
 
var html = str.replace(/is my \w*/, function (x) { 
 
    return "<b>" + x + "</b>"; 
 
}); 
 

 
console.log(html);

関連する問題