views:

169

answers:

6

I am just starting to learn javascript, so I don't have the skills to figure out what I assume is a trivial problem.

I'm working with a Wordpress blog that serves as a FAQ for our community and I am trying to pull together some tools to make managing the comments easier. Internet Duct Tape's Greasemonkey tools, like Comment Ninja, are helpful for most of it, but I want to be able to get a list of all the IP addresses that we're getting comments from in order to track trends and so forth.

I just want to be able to select a bunch of text on the comments page and click a bookmarklet (http://bookmarklets.com) in Firefox that pops up a window listing all the IP addresses found in the selection.

Update:

I kind of combined a the answers from levik and Jacob to come up with this:

javascript:ipAddresses=document.getSelection().match(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g).join("<br>");newWindow=window.open('', 'IP Addresses in Selection', 'innerWidth=200,innerHeight=300,scrollbars');newWindow.document.write(ipAddresses)

The difference is that instead of an alert message, as in levik's answer, I open a new window similar to Jacob's answer. The alert doesn't provide scroll bars which can be a problem for pages with many IP addresses. However, I needed the list to be vertical, unlike Jacob's solution, so I used the hint from levik's to make a
for the join instead of levik's \n.

Thanks for all the help, guys.

A: 

Here is a good article on obtaining the IP address of your visitors. You could display this in addition to their comment if you wanted or include it as a label or field in your page so you can reference it later.

Dr. Bob
+1  A: 

Use a regular expression to detect the IP address. A couple examples:

/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/
/^([1-9][0-9]{0,2})+\.([1-9][0-9]{0,2})+\.([1-9][0-9]{0,2})+\.([1-9][0-9]{0,2})+$/
jtimberman
A: 

Does anyone know how to do this as a javascript bookmarklet, though?

Jim
+2  A: 

In Firefox, you could do something like this:

javascript:alert(
  document.getSelection().match(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g)
  .join("\n"))

How this works:

  • Gets the selection text from the browser ("document.getSelection()" in FF, in IE it would be "document.selection.createRange().text")
  • Applies a regular expression to march the IP addresses (as suggested by Muerr) - this results in an array of strings.
  • Joins this array into one string separated by return characters
  • Alerts that string

The way you get the selection is a little different on IE, but the principle is the same. To get it to be cross-browser, you'd need to check which method is available. You could also do more complicated output (like create a floating DIV and insert all the IPs into it).

levik
Both this an Jacob's answer worked, but this one worked a little more like I need by popping up the alert window that the IPs can be copied from. Nice and short.Thanks.
Jim
+1  A: 

As a bookmarklet

javascript:document.write(document.getSelection().match(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g))

Just create a new bookmark and paste that javascript in

How to do it in Ubiquity

CmdUtils.CreateCommand({
    name: "findip",
    preview: function( pblock ) {
        var msg = 'IP Addresses Found<br/><br/> ';
        ips = CmdUtils.getHtmlSelection().match(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g);
        if(ips){
            msg += ips.join("<br/>\n");
        }else{
            msg += 'None';
        }
        pblock.innerHTML = msg;
    },

    execute: function() {
        ips = CmdUtils.getHtmlSelection().match(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g);
        if(ips){
            CmdUtils.setSelection(ips.join("<br/>\n"));
        }
    }
})
Jacob
A: 

Have a look at the rot13 bookmarklet for an example of selecting text and performing an action (in this case substitution) when the bookmarklet is clicked.

jtimberman