jquery @mention making the output a link

大兔子大兔子 提交于 2019-12-23 03:17:05

问题


Hey guys i'm using this plugin from Hawkee. Its like twitter where you can @mention someone. I'm having trouble with the output. This method:

updateHidden: function() {
        var trigger = this.options.trigger;

        var contents = this.element.val();
        for(var key in this.id_map) {
            var regex = trigger+key;
            regex = regex.replace(/[!@#\$%\^&\*\(\)\+=-\[\]\\';,\.\/\{\}\|":<>\?~_]/g, '\\$&');
            regex = new RegExp(regex, "g");
            //contents = contents.replace(regex, trigger+'['+this.id_map[key]+']');
            //I changed the code above to:
            contents = contents.replace(regex, '@[' + this.id_map[key] +':' + key + ']');
        }
        $(this.options.hidden).val(contents);
    }

The code above will be outputted to a hidden tag affecting its value wherein

Outputs: @[123:peterwateber] //Format is @[].

I'm using PHP as my back end. My problem is I wanna convert the output to

<a href="www.something.com/profile?pid=123">peterwateber</a>

I have a big problem with the codes here since I'm not good at RegEx. I have come up with the code:

    //THIS CODE SHOULD GET 1234,peterwateber,88,hi.

    $string = "@[1231:peterwateber] sdfsdfsdfsdfsdfsdf@[88:hi]sddsf";
    preg_match_all("^\[(.*?)\]^",$string,$matches,PREG_PATTERN_ORDER);
    foreach ($matches[1] as $match) {
        echo $match.'<br/>'; //outputs 1231:peterwateber, 88:hi
    }

    preg_match_all("^\[([\w\d]+):(.*?)\]^",$string,$aw,PREG_PATTERN_ORDER);
    foreach ($aw[1] as $match) {
        echo $match.'<br/>'; //sad to say this code outputs the text '1231 and 88'
    }

Moreso, to be able to get the output I have this form:

<form class="form-horizontal" data-post="request" method="post">
  <div class="control-group boxTextAreaHolder">
    <textarea placeholder="What are you thinking?" class="UITextarea" title="What are you thinking?" name="statuspost" id="statuspost" tag-status="this"></textarea>
    <input type="hidden" name="tags" id="tag-post" />
  </div>
</form>

When submitted the output will be processed to this function. This function does not allow any htmlspecialchars and detects a url like "http://stackoverflow.com"

private static function validate_text($text = '') {
    // This method is used internally as a FILTER_CALLBACK
    if (mb_strlen($text, 'utf8') < 1)
        return false;
    // Encode all html special characters (<, >, ", & .. etc) and convert
    //$str = nl2br(htmlspecialchars($text));
    $str = htmlspecialchars($text);
    // the new line characters to <br> tags:
    // Remove the new line characters that are left
    $str = str_replace(array(chr(10), chr(13)), '', $str);
    $text = preg_replace('#(script|about|applet|activex|chrome):#is', "\\1:", $str);
    $ret = ' ' . $text;
    $ret = preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $ret);
    $ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $ret);
    $ret = preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $ret);
    //$ret = preg_replace("#^*@([)([0-9-])(])#is", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $ret);
    $ret = substr($ret, 1);
    return $ret;
}

The problem now is that I don't know how to convert @[1234:peterwateber] to **<a href="www.something.com/profile?pid=123">peterwateber</a>** and how to exclude anchor tags from htmlspecialchars


回答1:


Regular expression to take 1231 - peterwateber and 88 - hi is

preg_match_all("#@\[(\w+)\:(\w+)\]#', $str);

It depends on what kind of characters do you have in your input string. \w assumes you have only "word" characters (letters and digits).

$hidden_input = '@[123:web]hello world!';

preg_match('#@\[(\w+)\:(\w+)\]\s*(.*)$#', $hidden_input, $m);

echo '<a href="'.m[1].'">'.$m[2].'</a>'.$m[3];



function validate_text($text = '') {
    // This method is used internally as a FILTER_CALLBACK
    if (mb_strlen($text, 'utf8') < 1)
        return false;
    // Encode all html special characters (<, >, ", & .. etc) and convert
    //$str = nl2br(htmlspecialchars($text));
    $str = htmlspecialchars($text);
    // the new line characters to <br> tags:
    // Remove the new line characters that are left
    $str = str_replace(array(chr(10), chr(13)), '', $str);
    $text = preg_replace('#(script|about|applet|activex|chrome):#is', "\\1:", $str);
    $ret = ' ' . $text;
    $ret = preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $ret);
    $ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $ret);
    $ret = preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $ret);
    //$ret = preg_replace("#^*@([)([0-9-])(])#is", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $ret);
    $ret = substr($ret, 1);
    return $ret;
}

var_dump(validate_text('@[123:peterwateber] fsdfsdfdsf'));

gives string(30) "@[123:peterwateber] fsdfsdfdsf"enter code here



来源:https://stackoverflow.com/questions/10042877/jquery-mention-making-the-output-a-link

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!