1

HTMLテキストの文字列内のすべてのテキストリンクを実際のクリック可能なリンクに置き換える必要があります。次の正規表現で正常に動作します。

/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi

それから私はそれが画像とすでにフォーマットされたリンクも置き換えることに気づきました。図src"と>の前にあるリンクを除外する必要があります...ここで回答した多くの質問で、少し検索して否定的な先読みについてたくさん読みました。これを試しました(最初の/の直後に何かを追加しました):

/(^(?!src="|>)\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi

しかし、これはもうどのリンクとも一致しません。^を付けずに、角かっこを変更するなどして、いくつかの同様のステートメントを試しましたが、何も機能しないようです。.{0}追加した部分と\bの間に挿入して、URLの直前にあるものだけを見て、それ以上離れたものは考慮しないようにしました。

4

3 に答える 3

3

編集:議論が長くなっていたので、代わりに答えを更新することにしました。

元の正規表現が機能することを信頼して、この回答の残りの部分で簡略化されたバージョンを参照します。

/\b(https?|ftp|file)/gi

今、あなたはこれを試みました:

/^(?!src="|>)\b(https?|ftp|file)/gi
 ^

ここでの主なエラーは、カレットによってマークされています:カレット。これにより、正規表現は行の先頭から一致するようになります。そのため、正規表現は何も一致しませんでした。それを削除して次に進みましょう:

/(?!src="|>)\b(https?|ftp|file)/gi

今回の主なエラーは、先読みアサーションの概念にあります。コメントで説明したように、このアサーションは冗長です。「 orまたはorに一致しない限り、httporhttpsまたはftporに一致する」と言っているからです。それはほとんど冗長なので、その文は私たちにとって意味がありません!代わりに、必要なのは後読みアサーションです。filesrc=">

/(?<!src="|>)\b(https?|ftp|file)/gi
   ^

なんで?src="文字列の後ろまたは> 後ろを見つけたいので、一致させたい可能性があります。問題?JavaScriptは後読みアサーションをサポートしていません。そこで、私は別の方法を提案しました。確かに、それは欠陥がありました(あなたが育てたように、HTMLが壊れた原因ではありませんが)。これが修正されました:

/(.[^>"]|[^=]")\b(https?|ftp|file)/gi
  ^^^^^^^^^^^^

これは確かに直感的ではない正規表現であり、説明が必要です。それは私たちのケースを2つに分割します。2文字のセットがあるとします。セットがまたはで終わらない場合、私たちはそれを疑っていません。行ってもいいです。続く可能性のある任意のURLに一致します。ただし、それまたはで終わる場合、「許される」唯一のケースは、最初の文字が。ではない場合です。ご覧のとおり、ここでは少し論理的なトリックがあります。>">"=

さて、なぜこれがあなたのHTMLを壊すかもしれないかについて。必ずJavaScriptを使用しreplace、最初にキャプチャしたグループをページに戻します。それぞれの一致を単に無に置き換えると、2文字のセットを「食い尽くす」ことになります。これは、破壊するのではなく、調査することだけを目的としています。

html.replace(/(.[^>"]|[^=]")\b(https?|ftp|file)/gi,
             function(match, $1, offset, original) {
                 return $1;
             });
于 2012-07-31T16:53:29.230 に答える
0

私は家に帰らなければならず、まだテストしていませんが、最初に必要のないHTMLを分離するというより簡単なタスクを処理する方が快適だと思います。

  1. 一致させて、処理したくないものの配列を取得します。
  2. 分割してすべてを取り除いてください。
  3. 分割された配列を繰り返し、URLを置き換えてから、一致したアイテムをスプライスして戻します
  4. 参加して戻る

唯一の前提は、テキストのアンカーまたはimgタグで終わらないことです。

function zipperParse(htmlText,matcher){
    var zipBackInArray = htmlText.match(matcher),
    workingArray = htmlText.split(matcher),
    i = workingArray.length;

    while(i--){
        buildAnchorTagIfURLPresent(workingArray[i]); //You got this one covered
        workingArray.splice(i,0,zipBackInArray.pop());
        //working backwards makes splice much easier to use here
    }
    return workingArray.join('');    
}

var toExclude = /<a[^>]*>[^>]*>|<img[^>]*>/g;
// is supposed to match all img and anchor pairs but not handling tags inside anchors yet

zipperParse(yourHtmlText,toExclude);
于 2012-07-31T23:38:17.597 に答える
0

このコードは私のために機能します...除外するためにGoogleApiKEYを変更するだけです..=>XXXXXXXXXXXXXXXXXXXXXXワードプレスのfunctions.phpテーマに配置します。まず最初に、グーグルマップのコードがサイトにどのように表示されるかを確認し、次にそれを置き換えられたものと一致させます。

function remove_script_version( $src ) { 
$parts1 = explode( '?', $src );
$parts2 = str_replace('//maps.googleapis.com/maps/api/js', '//maps.googleapis.com/maps/api/js?language=es&#038;v=3.31&#038;libraries=places&#038;key=XXXXXXXXXXXXXXXXXXXXXX&#038;ver=3.31', $parts1);
return $parts2[0]; }
add_filter( 'script_loader_src', 'remove_script_version', 15, 1 );
add_filter( 'style_loader_src', 'remove_script_version', 15, 1 );
于 2020-05-07T00:09:35.583 に答える