0

まったく同じ単語を 3 つ置き換えようとしているときに、コードが機能しない理由がわかりません。入力が「www.facebook.com www.facebook.com wwww.facebook.com」であるとしましょう

私の出力はこれであり、これは私が望むものではありません

<div class="content" style="font-size:13px;">
<a href="www.facebook.com">www.facebook.com</a>
<a href="&lt;a href=" www.facebook.com'=""> www.facebook.com</a>'&gt; www.facebook.com www.facebook.com
</div>

しかし、「www.facebook.com www.google.com wwww.yahoo.com」と入力すると、欲しいものが得られます

<div class="content" style="font-size:13px;">
<a href="www.facebook.com">www.facebook.com</a>
<a href=" www.google.com"> www.google.com</a> 
<a href="wwww.yahoo.com">wwww.yahoo.com</a>
</div>

私が実際にやろうとしているのは、ユーザーがテキスト領域にリンクを入力して送信するときです。このコードは、一致リンクをアンカー タグに置き換えます。

これは私の.jsです

var wordlink2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
var hyperlink2;

hyperlink2 = content.match(wordlink2);

var $item = $("#ClassroomCommentComment").val();


if (hyperlink2 != null) {
    for (x = 0; x < hyperlink2.length; x++) {
        var site2 = hyperlink2[x].toString();
        var z2 = $item.replace(hyperlink2[x], "<a href='" + site2 + "'>" + site2 + "</a>");
        $item = z2;
    }
}​

これにはもうビックリです。誰でもこれで私を助けることができます:(

追加のこれは、より正確にするための私の機能です。

function checkSubmit()
    {
        var $item = $("#ClassroomCommentComment").val();
        var $cont = $("#FileFile").val();


        if($item == "")
        {
            return false;
        }
        else
        {
            //$("#ClassroomCommentComment").css('color', 'white');

            if (hyperlink != null)
            {
                for (x= 0; x<hyperlink.length; x++)
                {

                    var site = hyperlink[x].toString();
                    var z = $item.replace(hyperlink[x],"<a href='" + site + "'>" + site +"</a>" );
                    $item = z;
                }       
            }

            if (hyperlink2 != null)
            {               
                for (x= 0; x<hyperlink2.length; x++)
                {
                    var site2 = hyperlink2[x].toString();
                    var z2 = $item.replace(hyperlink2[x],"<a href='" + site2 + "'>" + site2 +"</a>" );
                    $item = z2;

                }       
            }



            for (x=0; x<=arraycontroller; x++)
            {
                var n = $item.replace(fullnamewp[x],"<a href = 'http://www.classoncloud.org/" + userlink[x] + "'>" + fullnamewp[x] +"</a>" );
                $item = n;
                //$("#ClassroomCommentComment").val(n);
            }

            if (hash != null)   
            {
                for (x= 0; x<hash.length; x++)
                {
                    var new_item = hash[x].toString().substr(1).split("#");
                    var b = $item.replace(hash[x],"<a href='http://www.classoncloud.org/results/" + new_item + "'>" + hash[x] +"</a>" );
                    $item = b;
                }   
            }

            arraycontroller = 0;
            fullnamewp = [];
            userlink = [];


            var classroom_id = $("#ClassroomCommentClassroomId").val();
            var user_id = $("#ClassroomCommentUserId").val();
            var comment = $item;
            var image = "<?php echo $profile_pic; ?>";
            var name = "<?php echo $current_user_name; ?>";




        $.ajax({
        type: "POST",   
        url: '/learns/classroom/',
        data: "data[ClassroomComment][classroom_id]=" + classroom_id + "&data[ClassroomComment][user_id]=" + user_id + "&data[ClassroomComment][comment]=" + comment,
        dataType: "html",
        success: function(data){



        var parent_id = data;



        $('#comment-list').prepend('<div class="comments">  <a href="'+user_id+'"  class="image"><img src="'+image+'" width="50" height="50">   </a><a href="#" class="wall_delete" id='+parent_id+' style="display: none;"></a>    <div class="name">  <a href="'+user_id+'" class="close">X</a><a href="#" style="font-size:13px;">'+name+'</a><div class="content" style="font-size:13px;">'+comment+'</div> <div class="time"><div class="star-count"></div><a class="my-star" href="#" id='+parent_id+'>myStar .</a><a class="click" href="#">Comment</a> 1 seconds&nbsp;ago </div></div>       <form id="LearnsClassroomForm" accept-charset="utf-8" method="post" action="/learns/classComment"><input type="hidden" name="data[ClassroomComment][parent_id]" action="classroom" value='+parent_id+' id="ClassroomCommentParentId"><input type="hidden" name="data[ClassroomComment][classroom_id]" action="classroom" value="'+classroom_id+'"id="ClassroomCommentClassroomId"><input type="hidden" name="data[ClassroomComment][user_id]" action="classroom" value="'+user_id+'" id="ClassroomCommentUserId"><div class="displaycomment"><textarea name="data[ClassroomComment][comment]" class="textarea" placeholder="Write comment here..." id="ClassroomCommentComment" style="overflow: hidden; word-wrap: break-word; resize: none; height: 18px;"></textarea> <input type="submit" value="Comment" class="submit" style=" margin-right:7px; margin-top:10px;"> </div> </form></div>');

            }
        }); 


        $("#ClassroomCommentComment").val("");
        $("#ClassroomCommentComment").css('color', 'black');

        $($(this).parent().parent().find("textarea")).css("height","30px");     
        return false;   

        }   

    }
4

3 に答える 3

4

これを必要以上に複雑にしていると思います。この.replace()メソッドは、置換対象を指定する正規表現を受け入れます。正規g表現にフラグを設定すると、グローバル置換が実行されます。replaceしたがって、次のように を 1 回呼び出すだけで、すべてのハイパーリンクに適切な変更を加えることができます。

var $item = $("#ClassroomCommentComment").val();
$item = $item.replace(/((^|[^\/])(www\.[\S]+(\b|$)))/gi, '<a href="$1">$1</a>');
// do something with $item

デモ: http://jsfiddle.net/7vcZd/1/

.match()の最初の引数としてその一致の結果を使用するために、最初にメソッドを使用する必要はありません.replace()

コードが奇妙な出力を生成していた理由は、最初のパラメーターとして文字列を渡して.replace()いたためです。これを行うと、グローバルな置換は行われず、最初のインスタンスが置換されるだけです。ループで同じ置換を行ったため、2 回目以降の置換は<a ...、最初の置換で追加したパーツ内にありました。ループの最後にステートメントを追加するconsole.log($item)と、各反復で何が起こっているかがわかります...

于 2012-11-19T23:36:10.750 に答える
1

元の質問から、これがあなたが望んでいたものだと思いました:http://jsfiddle.net/nb6SQ/6/

var wordlink2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
var items = $(".content a");
var repval = $("#replacetext").val();

items.each(function(i,el) {
    var item = $(el);
 item.attr("href", item.attr("href").replace(wordlink2, repval));
 item.text(item.text().replace(wordlink2, repval));
});
于 2012-11-19T23:45:04.793 に答える
1

次の行で replace が機能する方法が問題の原因です。

$item.replace(hyperlink2[x],"<a href='" + site2 + "'>" + site2 +"</a>" );

$itemこれが行うことは、 の最初のケースを検索しhyperlink2[x]、それをリンクに置き換えることです。

3 回の例ではwww.facebook.com、常に www.facebook.com の最初のインスタンスをリンクに置き換えます。

エラーが発生した場所を分析するために、for ループを実行して、毎回何が起こるかを見てみましょうcontent

for ループに入る前に

www.facebook.com www.facebook.com www.facebook.com

for ループの最初のインタラクションの後

<a href='www.facebook.com'>www.facebook.com</a>
www.facebook.com www.facebook.com

for ループの 2 回目の反復後

<a href='<a href='www.facebook.com'>www.facebook.com</a>
'>www.facebook.com</a>
www.facebook.com www.facebook.com

これは、 の最初のインスタンスを探して置換するためですwww.facebook.comが、元の文字列が変更され、そのインスタンスが href='' 内にあるためです。

replace を使用するよりも、文字列を作成して返す方が適切です。

そのようです:

Javascript

var content = "www.facebook.com www.facebook.com www.facebook.com";

var wordlink2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
var hyperlink2 = content.match(wordlink2);

var returnString = "";

if (hyperlink2 !== null) {
    for (x = 0; x < hyperlink2.length; x++) {
        var site2 = hyperlink2[x].toString();
        returnString += "<a href='" + site2 + "'>" + site2 + "</a>\n";
    }
}

$("#ClassroomCommentComment").text(returnString);

http://jsfiddle.net/RDkcc/1/

またはさらに良いことに、nnnnnn の答えが最もよく見えます。

于 2012-11-19T23:37:21.443 に答える