mIRC Homepage
Posted By: LMN Regular expressions help? - 24/04/11 02:28 PM
I have a script that uses sockets. But I always have the same trouble. Example, a piece of a html code:
<span class="title">Just A random text</span>
How can I get the piece of text by using regex or something else?
Posted By: 5618 Re: Regular expressions help? - 24/04/11 02:48 PM
try...
Code:
/noop $regex(title,%string,/<span class="title">(.+)<\/span>/ig)

...and then using...
Code:
$regml(title,N)

...to retrieve the title, where N is 1, 2, 3, etc. for the first match, second match, etc.
Posted By: LMN Re: Regular expressions help? - 24/04/11 03:42 PM
It works smile

Another question:
I need a timer to sockclose my socket, because otherwise it's closed before the information is received. But if I use:
Code:
/timer 1 1 /sockclose [name]

there wil be like 700 timers of closing the socket. Can someone help me with this problem.
Posted By: Tomao Re: Regular expressions help? - 24/04/11 05:46 PM
Edit: I'm not sure why 5618 used "title" and the /g modifier when they aren't really needed.
Posted By: Tomao Re: Regular expressions help? - 24/04/11 05:50 PM
Originally Posted By: LMN
Another question:
I need a timer to sockclose my socket, because otherwise it's closed before the information is received. But if I use:
Code:
/timer 1 1 /sockclose [name]

there wil be like 700 timers of closing the socket. Can someone help me with this problem.
under your socketopen event, add
Code:
sockwrite -nt $sockname Connection: close
under your "Host:" this will prompt the connection to be closed after the info is received.
Posted By: Riamus2 Re: Regular expressions help? - 24/04/11 06:31 PM
As long as you put a /sockclose command at the very end of your socket script and not anywhere else, it should not close before you're done.

There are also $htmlfree identifiers floating around (including on this forum), where it will strip all of the html tags from text rather than using different ones for different tags.
Posted By: hixxy Re: Regular expressions help? - 24/04/11 07:22 PM
You need to make your regex ungreedy by changing ".+" to ".+?" like this:

Code:
//noop $regex(title,%string,/<span class="title">(.+?)<\/span>/ig)


You can see the difference between the two by typing these two commands:

Code:
//var %string = <span class="title">abc</span><span class="anotherspan">def</span> | noop $regex(title,%string,/<span class="title">(.+?)<\/span>/ig) | echo -a $regml(title,1)
//var %string = <span class="title">abc</span><span class="anotherspan">def</span> | noop $regex(title,%string,/<span class="title">(.+)<\/span>/ig) | echo -a $regml(title,1)


Mine (ungreedy): abc
Yours (greedy): abc</span><span class="anotherspan">def

A greedy regex matches as much data as it possibly can, while an ungreedy regex matches as little data as it possibly can. This is why yours matches up to the final </span> and mine only matches up to the first </span> smile
Posted By: Tomao Re: Regular expressions help? - 24/04/11 09:06 PM
hixxy, if you already make it un-greedy, why do you keep the /g modifier? I believe you can use the /U modifier as well:
Code:
/<span class="title">(.+)<\/span>/iU
Posted By: hixxy Re: Regular expressions help? - 24/04/11 10:24 PM
I left /g in there so that it will support multiple span tags on one line, but you would need to loop through $regml(title,N)
Posted By: Riamus2 Re: Regular expressions help? - 25/04/11 02:29 AM
To clarify, there are two different "greedy" at work here. Yours, Tomao, would be greedy in that it would take everything until the final matching text. So, as hixxy mentioned, you would capture everything to the last </span>. If you only have one on a line, that's not going to hurt anything, but if there are multiple </span> on a line, you will get unwanted data. You also won't be able to get $regml(2) because there will only every be one match.

With hixxy's, the greedy means to accept multiple matches. The match only goes to the first </span>. Then, the next match, if there is one, will go to the next one and so on. So you can then use $regml(N) to get multiple matches if there is more than one on the line.

One other note... /g really shouldn't ever be needed in this specific case. Normally, there should never be more than one <title> tag on a page. But it's a good thing to understand because it is very useful for other situations.
Posted By: Wims Re: Regular expressions help? - 25/04/11 01:28 PM
You're not clarifying anything, rather the opposite.
There are not two different 'greedy' here, greedy has only one meaning:
Quote:
A greedy regex matches as much data as it possibly can, while an ungreedy regex matches as little data as it possibly can.
that's all.

Tomao: /g has nothing to do with greedy and /U only makes the whole expression ungreedy by default, where .+? would now represent a greedy search
Posted By: hixxy Re: Regular expressions help? - 25/04/11 02:51 PM
Although "greedy" is probably a better word to describe the behaviour of the /g modifier in regex, it actually means "global" - this is probably so as not to confuse it with greedy matching.

We're not matching <title>, we're matching a span tag with the class name of title: <span class="title"></span> and, as far as I know, you can have as many of those as you want on a page and it will still be valid HTML. Correct me if I'm wrong smile
Posted By: Riamus2 Re: Regular expressions help? - 25/04/11 05:57 PM
@Wims: Ok, /g is global. I've heard it called greedy from enough people that I thought that was the correct name for it. Anyhow, take out the "greedy" from my previous post and it still explains the difference between the two things. There are two "things" going on rather than two kinds of "greedy".

@hixxy: You're right. I was thinking <title> rather than <span...>. It's been a long time since I've done much with HTML and most of that was before <span> was used very much. So I forgot how it was being used. Oops. blush

I don't think a well written site is likely to have more than one on a single line, though. There may be some valid reasons for it, but normally I don't think it would be necessary. Anyhow, /g isn't going to hurt anything whether it is needed or not. smile
Posted By: LMN Re: Regular expressions help? - 27/04/11 02:47 PM
There are in total 8 matches. But instead of that $regml(title,2) and $regml(title,3) etc. show the second and third match etc., I just get 8 times a new $regml(title,1)
I am now using the
Code:
//noop $regex(title,%string,/<span class="title">(.+?)<\/span>/ig)
code.
Can anyone help me by getting the second match as $regml(2) and the third match as $regml(3) etc. instead of 8 times a different $regml(1)?
Posted By: Riamus2 Re: Regular expressions help? - 27/04/11 03:07 PM
That works fine for what it is meant to do. If you have the following as the %string-

Code:
<span class="title">text1</span><span class="title">text2</span><span class="title">text3</span>


And then use that $regex, then:

$regml(title,1) = text1
$regml(title,2) = text2
$regml(title,3) = text3

If you give us your %sting that has 8 matches in it, we can tell you if there's an issue.
Posted By: LMN Re: Regular expressions help? - 27/04/11 03:11 PM
It's in Dutch, so you won't understand much of the text:
Code:
 /noop $regex(FCKnudde,%sockreader,/<span class="title">(.+?)<\/span>/ig) | if ($regml(FCKnudde,1) != $null) { /echo -a regml 1: $regml(FCKnudde,1) $+ , regml 2: $regml(FCKnudde2,2) $+ , regml 3: $regml(FCKnudde,3) $+ , regml 4: $regml(FCKnudde,4)

Results in:
Code:
regml 1: Ferguson lyrisch over Neuer, regml 2: , regml 3: , regml 4:
regml 1: Ajax laat Dost vallen en wil Matavz, regml 2: , regml 3: , regml 4:
regml 1: Bayern wordt steeds gezelliger, regml 2: , regml 3: , regml 4:
regml 1: Real Madrid verslaat Barcelona, regml 2: , regml 3: , regml 4:
regml 1: Van der Wiel voor 10 miljoen naar Bayern, regml 2: , regml 3: , regml 4:
regml 1: Van den Boog: Gaat verdomme goed met Ajax!, regml 2: , regml 3: , regml 4:
regml 1: Magische aanpak Andries Jonker werkt, regml 2: , regml 3: , regml 4:
regml 1: AZ jat 4e plek van ADO, regml 2: , regml 3: , regml 4:
Posted By: 5618 Re: Regular expressions help? - 27/04/11 03:17 PM
That's probably because there are (at least) 8 /sockreads, all of which are run through /noop $regex() separately.
So this has nothing to do with $regml() but rather with the number of (and appearance of <span class="title">...<\/span> in) /sockread until the receive buffer is empty.
Posted By: LMN Re: Regular expressions help? - 27/04/11 03:19 PM
But can I change that or is that impossible?
Posted By: 5618 Re: Regular expressions help? - 27/04/11 03:33 PM
Of course it can be changed. But what *do* you want the script to show? And you'll need to post the entire script.
Posted By: Riamus2 Re: Regular expressions help? - 27/04/11 03:53 PM
In addition to your answers to 5618, $regml(title,N) where N is a number will only populate if everything is in a single variable/line. If they are all on separate lines (separate /sockreads), then there is only ever 1 match each time $regex() is called. That means $regml(title,2) and up will be $null.

If you want them all on one line (which may end making the line too long to display), then you'd want to set a variable and add to it...

sockread #1 sets variable to $regml(title,1)
sockread #2 sets variable to variable, $regml(title,2)
etc.

In the end, you have a variable with all of the titles listed.
Posted By: LMN Re: Regular expressions help? - 27/04/11 03:54 PM
Code:
alias FCKnudde {
  /sockclose FCKnudde
  /sockopen FCKnudde www.nusport.nl 80 
} 

on *:SOCKOPEN:FCKnudde: {
  sockwrite -nt $sockname GET /fc-knudde/ HTTP/2.0
  sockwrite -nt $sockname Host: www.nusport.nl
  sockwrite -nt $sockname Connection: close
  sockwrite -nt $sockname $crlf
}

on *:SOCKREAD:FCKnudde: {
  if ($sockerr) { echo -a SOCKERR: $sockerr | halt }
  else {
    var %sockreader
    sockread -f %sockreader
    /noop $regex(FCKnudde,%sockreader,/<span class="title">(.+?)<\/span>/ig) | if ($regml(FCKnudde,1) != $null) { /echo -a regml 1: $regml(FCKnudde,1) $+ , regml 2: $regml(FCKnudde2,2) $+ , regml 3: $regml(FCKnudde,3) $+ , regml 4: $regml(FCKnudde,4) }
  }
}

It shows:
Code:
regml 1: Ferguson lyrisch over Neuer, regml 2: , regml 3: , regml 4:
regml 1: Ajax laat Dost vallen en wil Matavz, regml 2: , regml 3: , regml 4:
regml 1: Bayern wordt steeds gezelliger, regml 2: , regml 3: , regml 4:
regml 1: Real Madrid verslaat Barcelona, regml 2: , regml 3: , regml 4:
regml 1: Van der Wiel voor 10 miljoen naar Bayern, regml 2: , regml 3: , regml 4:
regml 1: Van den Boog: Gaat verdomme goed met Ajax!, regml 2: , regml 3: , regml 4:
regml 1: Magische aanpak Andries Jonker werkt, regml 2: , regml 3: , regml 4:
regml 1: AZ jat 4e plek van ADO, regml 2: , regml 3: , regml 4:

I want to get every sentence in a variable, so it's handy if I can get it like this:
Code:
regml 1: Ferguson lyrisch over Neuer, regml 2: Ajax laat Dost vallen en wil Matavz, regml 3: Bayern wordt steeds gezelliger, regml 4: Real Madrid verslaat Barcelona, etc.

Posted By: LMN Re: Regular expressions help? - 27/04/11 03:56 PM
Originally Posted By: Riamus2
In addition to your answers to 5618, $regml(title,N) where N is a number will only populate if everything is in a single variable/line. If they are all on separate lines (separate /sockreads), then there is only ever 1 match each time $regex() is called. That means $regml(title,2) and up will be $null.

If you want them all on one line (which may end making the line too long to display), then you'd want to set a variable and add to it...

sockread #1 sets variable to $regml(title,1)
sockread #2 sets variable to variable, $regml(title,2)
etc.

In the end, you have a variable with all of the titles listed.

Where should I add it?
Posted By: Tomao Re: Regular expressions help? - 27/04/11 06:11 PM
Please delete. Double posted by accident.
Posted By: Tomao Re: Regular expressions help? - 27/04/11 06:16 PM
Originally Posted By: LMN
I want to get every sentence in a variable, so it's handy if I can get it like this:
regml 1: Ferguson lyrisch over Neuer, regml 2: Ajax laat Dost vallen en wil Matavz, regml 3: Bayern wordt steeds gezelliger, regml 4: Real Madrid verslaat Barcelona, etc.
The code below will do exactly as you've described:
Code:
alias FCKnudde {
  sockclose FCKnudde
  sockopen FCKnudde www.nusport.nl 80 
} 
on *:SOCKCLOSE:FCKnudde: {
  var %x, %. 1
  while (%. <= $numtok(%sockreader,160)) {
    %x = %x $+(regml,$chr(32),%.,:,$chr(32),$+($,%.))
    inc %.
  }
  tokenize 160 %sockreader
  echo -a $left([ [ %x ] ],-1)
  unset %sockreader
}
on *:SOCKOPEN:FCKnudde: {
  sockwrite -nt $sockname GET /fc-knudde/ HTTP/2.0
  sockwrite -nt $sockname Host: www.nusport.nl
  sockwrite -nt $sockname Connection: close
  sockwrite -nt $sockname
}
on *:SOCKREAD:FCKnudde: {
  if ($sockerr) { echo -a SOCKERR: $sockerr | halt }
  else {
    sockread -fn &sockreader
    if ($regex($bvar(&sockreader,1-).text,/<span class="title">(.+?)<\/span>/i)) {
      set %sockreader $addtok(%sockreader,$+($regml(1),$chr(44),$chr(32)),160)
    }
  }
}
Posted By: LMN Re: Regular expressions help? - 28/04/11 04:38 PM
Edit: Because of a mistake of myself it didn't work, now it does.
But with this script I can't put the sentences in variables myself. Can someone help me with that?
Posted By: Tomao Re: Regular expressions help? - 28/04/11 05:11 PM
Quote:
Because of a mistake of myself it didn't work, now it does.
What mistake did you make?
Quote:
I can't put the sentences in variables myself
What do you mean by that? The socket script you've shown above is to grab the info from a website and fill the variable or binary variable under sockread as a buffer.

Have you tried the example I provided?
Posted By: LMN Re: Regular expressions help? - 28/04/11 05:15 PM
The mistake doesn't matter, it was with having 2 scripts that work with the trigger /fcknudde, so that's why it went wrong. I used your script, it echoes:
Code:
regml 1: Echte voetbal zegeviert, regml 2: Ferguson lyrisch over Neuer, regml 3: Ajax laat Dost vallen en wil Matavz, regml 4: Bayern wordt steeds gezelliger, regml 5: Real Madrid verslaat Barcelona, regml 6: Van der Wiel voor 10 miljoen naar Bayern, regml 7: Van den Boog: Gaat verdomme goed met Ajax!, regml 8: Magische aanpak Andries Jonker werkt

But now I want every sentence in a different variable. So that this is standing in my variable list:
Code:
Let's call the variables like this:
%fcknudde1 Echte voetbal zegeviert
%fcknudde2 Ferguson lyrisch over Neuer
%fcknudde3 Ajax laat Dost vallen en wil Matavz
etc.

Can you help me with that?
Posted By: Riamus2 Re: Regular expressions help? - 28/04/11 05:42 PM
If you had said you wanted it in separate variables to begin with rather than all in one, it would have been faster to get you want you wanted.

Code:
alias FCKnudde {
  sockclose FCKnudde
  unset %fcknudde.*
  sockopen FCKnudde www.nusport.nl 80 
} 
on *:SOCKOPEN:FCKnudde: {
  sockwrite -nt $sockname GET /fc-knudde/ HTTP/2.0
  sockwrite -nt $sockname Host: www.nusport.nl
  sockwrite -nt $sockname Connection: close
  sockwrite -nt $sockname
}
on *:SOCKREAD:FCKnudde: {
  if ($sockerr) { echo -a SOCKERR: $sockerr | halt }
  else {
    sockread -fn &sockreader
    if ($regex($bvar(&sockreader,1-).text,/<span class="title">(.+?)<\/span>/i)) {
      inc %fcknudde.cnt
      set %fcknudde. $+ %fcknudde.cnt $regml(1)
    }
  }
}



** Not really sure why we're using HTTP 2.0 here. Typically, it's 1.0 or sometimes 1.1. But as long as it's working, it should be fine.
Posted By: LMN Re: Regular expressions help? - 28/04/11 05:51 PM
There is only 1 variable:
Code:
%fcknudde. Magische aanpak Andries Jonker werkt

Fixed it myself:
Code:
inc %fcknudde.cnt
should have been
Code:
%c

Thank all of you for your time and effort. I've learnt more of Regular expressions and some other things and my script is ready to be used. Thank you!
Posted By: Tomao Re: Regular expressions help? - 28/04/11 05:54 PM
Riamus2, your edit shows the variables like this:
Quote:
%fcknudde.cnt 8
%fcknudde. Magische aanpak Andries Jonker werkt
This, I reckon, is what LMN wants:
Code:
alias FCKnudde {
  sockclose FCKnudde
  sockopen FCKnudde www.nusport.nl 80 
} 
on *:SOCKCLOSE:FCKnudde: {
  var %x, %. 1
  while (%. <= $numtok(%sockreader,160)) {
    set $+(%,fcknudde,%.) $gettok(%sockreader,%.,160)
    inc %.
  }
  unset %sockreader
}
on *:SOCKOPEN:FCKnudde: {
  sockwrite -nt $sockname GET /fc-knudde/ HTTP/2.0
  sockwrite -nt $sockname Host: www.nusport.nl
  sockwrite -nt $sockname Connection: close
  sockwrite -nt $sockname
}
on *:SOCKREAD:FCKnudde: {
  if ($sockerr) { echo -a SOCKERR: $sockerr | halt }
  else {
    sockread -fn &sockreader
    if ($regex($bvar(&sockreader,1-).text,/<span class="title">(.+?)<\/span>/i)) {
      set %sockreader $addtok(%sockreader,$regml(1),160)
    }
  }
}
Quote:
%fcknudde1 Echte voetbal zegeviert
%fcknudde2 Ferguson lyrisch over Neuer
%fcknudde3 Ajax laat Dost vallen en wil Matavz
%fcknudde4 Bayern wordt steeds gezelliger
%fcknudde5 Real Madrid verslaat Barcelona
%fcknudde6 Van der Wiel voor 10 miljoen naar Bayern
%fcknudde7 Van den Boog: Gaat verdomme goed met Ajax!
%fcknudde8 Magische aanpak Andries Jonker werkt
Posted By: LMN Re: Regular expressions help? - 28/04/11 05:56 PM
Originally Posted By: Tomao
Riamus2, your edit shows the variables like this:
Quote:
%fcknudde.cnt 8
%fcknudde. Magische aanpak Andries Jonker werkt
This, I reckon, is what LMN wants:
Code:
alias FCKnudde {
  sockclose FCKnudde
  sockopen FCKnudde www.nusport.nl 80 
} 
on *:SOCKCLOSE:FCKnudde: {
  var %x, %. 1
  while (%. <= $numtok(%sockreader,160)) {
    set $+(%,fcknudde,%.) $gettok(%sockreader,%.,160)
    inc %.
  }
  unset %sockreader
}
on *:SOCKOPEN:FCKnudde: {
  sockwrite -nt $sockname GET /fc-knudde/ HTTP/2.0
  sockwrite -nt $sockname Host: www.nusport.nl
  sockwrite -nt $sockname Connection: close
  sockwrite -nt $sockname
}
on *:SOCKREAD:FCKnudde: {
  if ($sockerr) { echo -a SOCKERR: $sockerr | halt }
  else {
    sockread -fn &sockreader
    if ($regex($bvar(&sockreader,1-).text,/<span class="title">(.+?)<\/span>/i)) {
      set %sockreader $addtok(%sockreader,$regml(1),160)
    }
  }
}
Quote:
%fcknudde1 Echte voetbal zegeviert
%fcknudde2 Ferguson lyrisch over Neuer
%fcknudde3 Ajax laat Dost vallen en wil Matavz
%fcknudde4 Bayern wordt steeds gezelliger
%fcknudde5 Real Madrid verslaat Barcelona
%fcknudde6 Van der Wiel voor 10 miljoen naar Bayern
%fcknudde7 Van den Boog: Gaat verdomme goed met Ajax!
%fcknudde8 Magische aanpak Andries Jonker werkt

It's already fixed. Thank you for your time smile
Posted By: Tomao Re: Regular expressions help? - 28/04/11 06:05 PM
Well you might want to add:
Code:
on *:SOCKCLOSE:FCKnudde: { unset %c }
So the %c var doesn't get left behind.

If left unset, it'll become like this after the second trigger:
Quote:
%c 16
%fcknudde.1 Echte voetbal zegeviert
%fcknudde.2 Ferguson lyrisch over Neuer
%fcknudde.3 Ajax laat Dost vallen en wil Matavz
%fcknudde.4 Bayern wordt steeds gezelliger
%fcknudde.5 Real Madrid verslaat Barcelona
%fcknudde.6 Van der Wiel voor 10 miljoen naar Bayern
%fcknudde.7 Van den Boog: Gaat verdomme goed met Ajax!
%fcknudde.8 Magische aanpak Andries Jonker werkt
%fcknudde.9 Echte voetbal zegeviert
%fcknudde.10 Ferguson lyrisch over Neuer
%fcknudde.11 Ajax laat Dost vallen en wil Matavz
%fcknudde.12 Bayern wordt steeds gezelliger
%fcknudde.13 Real Madrid verslaat Barcelona
%fcknudde.14 Van der Wiel voor 10 miljoen naar Bayern
%fcknudde.15 Van den Boog: Gaat verdomme goed met Ajax!
%fcknudde.16 Magische aanpak Andries Jonker werkt
And it just keeps incrementing to make your variables large.
Posted By: LMN Re: Regular expressions help? - 28/04/11 06:58 PM
Maybe that's handy ^^
Posted By: LMN Re: Regular expressions help? - 28/04/11 07:08 PM
One last question:
if I have:
Code:
<a href="#" onclick="NU.popup('/fc-knudde/1000709/popup.html','Cartoon','480','730'); return false;">

Hoe can I get the part:
Code:
/fc-knudde/1000709/popup.html

with a regex then? If I can get them by $regml then it's fine, then I can finish it myself now.
Posted By: Riamus2 Re: Regular expressions help? - 28/04/11 07:10 PM
Actually, %c would be better as %fcknudde.cnt . I changed it to that on purpose, but ended up forgetting one of them. I'll edit the orginal to show.

Reasons to use that instead of %c-
1) Only a single unset is necessary (already included in what I posted above).
2) single characters or common names are usually a bad idea for global variables. %c is great for a local variable counter, but in this instance, you need a global variable and for that, %c is a bad idea. There is too much chance of conflicts with other scripts. And in case anyone doesn't know, /set is global and /var is local.
Posted By: Tomao Re: Regular expressions help? - 28/04/11 09:32 PM
Originally Posted By: LMN
One last question:
if I have:
Code:
<a href="#" onclick="NU.popup('/fc-knudde/1000709/popup.html','Cartoon','480','730'); return false;">

Hoe can I get the part:
Code:
/fc-knudde/1000709/popup.html

Code:
//tokenize 40 <a href="#" onclick="NU.popup('/fc-knudde/1000709/popup.html','Cartoon','480','730'); return false;"> | echo -a $gettok($2,1,39)
You don't have to engage regex in everything you code...
Posted By: Sherip Re: Regular expressions help? - 29/04/11 05:41 AM
Originally Posted By: LMN
One last question:
if I have:
Code:
<a href="#" onclick="NU.popup('/fc-knudde/1000709/popup.html','Cartoon','480','730'); return false;">

Hoe can I get the part:
Code:
/fc-knudde/1000709/popup.html

with a regex then? If I can get them by $regml then it's fine, then I can finish it myself now.


This would get it with regex. The \x28 is hex for the open parenthesis. Don't know why but Mirc gives an error if the open paren is simply escaped with a backslash as I normally would do.
Code:
var %subj = <a href="#" onclick="NU.popup('/fc-knudde/1000709/popup.html','Cartoon','480','730'); return false;">
noop $regex(%subj, /\x28'([^']+)/)
echo -s $regml(1)

Posted By: Tomao Re: Regular expressions help? - 29/04/11 08:01 AM
You can also use \50 in place of \x28

You're right about not being able to escape the parenthesis. I think mIRC mistakes it for its own bracing or something.

This also applies to mIRC's regex on text event, which doesn't have escape sequence. The only solution is using octal chrs.

Though most special characters can be treated literal when using the $regex() identifier.
Posted By: Sherip Re: Regular expressions help? - 29/04/11 12:31 PM
Originally Posted By: Tomao
You can also use \50 in place of \x28


I prefer to use hex for literals as there is no ambiguity. If you want to use octals for literals, I would suggest to use \050 because \0 followed by two additional digits is always interpreted as a octal, whereas \50 is ambiguous and PCRE has to decide if its a backreference or an octal.

Originally Posted By: Tomao
You're right about not being able to escape the parenthesis. I think mIRC mistakes it for its own bracing or something.

This also applies to mIRC's regex on text event, which doesn't have escape sequence. The only solution is using octal chrs.

Though most special characters can be treated literal when using the $regex() identifier.


Actually if you put the pattern in a variable, the escaped open paren doesn't interfere with mirc's parsing.

Code:
  var %subj = <a href="#" onclick="NU.popup('/fc-knudde/1000709/popup.html','Cartoon','480','730'); return false;">
  var %pat = /\('([^']+)/
  noop $regex(%subj, %pat)
  echo -s $regml(1)


Posted By: Wims Re: Regular expressions help? - 29/04/11 02:43 PM
Yes, this is how mirc parse an identifier, every litteral ( ) must be balanced in their parameters or mirc will report an error
Posted By: Tomao Re: Regular expressions help? - 29/04/11 08:28 PM
Yes, I overlooked the feasibility of using a var.

The fact remains, the on text regex has no escape sequence, and we either need to use hex or octal to escape certain characters.
Posted By: Wims Re: Regular expressions help? - 29/04/11 10:39 PM
Quote:
the on text regex has no escape sequence, and we either need to use hex or octal to escape certain characters.
The bold part doesn't make sense confused (it's understood though) but that last statement is not true, the only thing we need to do is by passing the way mirc parses a code.
Using hex or octal to match a colon inside the matchtext of an event's definition because you used the $ prefix is one solution, but you could also not use the $ prefix and use $regex without any hex or octal, I just wanted to make that clear.
Posted By: Tomao Re: Regular expressions help? - 30/04/11 12:34 AM
Wims, what I was trying to say is this:

Quote:
on $*:text:/http:///Si:#:{
This will not match http:// It doesn't matter if you escape the colon character as \:

Quote:
on $*:text:/http\x3A///Si:#:{
By using \x3A, this regex will match http:// without a problem.

This does not apply to the use of $regex()
Posted By: Wims Re: Regular expressions help? - 30/04/11 01:10 AM
I know what you were trying to say:
Quote:
The bold part doesn't make sense (it's understood though)
It's just that it's not about regex, you can't match a litteral colon inside the matchtext on an event, regex or not.
Your statement was then implying that octal or hex was the only solutions, as I said I just wanted to make it clear that it wasn't
Quote:
you could also not use the $ prefix and use $regex without any hex or octal, I just wanted to make that clear.

Note: you don't need to escape a colon in regex anyway
Posted By: Tomao Re: Regular expressions help? - 01/05/11 10:15 PM
Yes, I had the interpretation of "escape sequence" misunderstood and misconstrued. I learned that from this post initially, and I quote:

Why not escape it:
Code:

/^!foobar\:\S+/

Then you make the colon sign literal so it won't be associated with regex's special meaning.

Wiz126 replied:

This has nothing to do with regex, in fact he wants it to work with regex, not escape it. Like I said in my previous post its the way mIRC parses the event, also there is no escape sequences for match texts.

If you have something like: on $*:text:/^!foobar (?\:\S+)/:#:{

mIRC will parse is into "$*", "text", "/^!foobar (?\", "\S+)/", "?"
notice, at that point your matchtext is broken, this is done way before the matchtext is even being matched. as a result you simply cannot have colons in the matchtext at all.

Edited by Wiz126 (15/03/11 08:03 PM)

I really need to get with the program.
Posted By: LMN Re: Regular expressions help? - 03/05/11 06:32 PM
But now I use:

Code:
/set %FCToken1 $gettok(%sockreader,1,40) | echo -a %FCToken1 | echo -a $gettok(%FCToken1,1,39)

It returns:
Code:
<span class="title">Knudde op vakantie</span><span class="cat">Maandag</span>
-
* /echo: insufficient parameters (line 22, script5.ini)
-
<span class="title">Robben: Bayern mist een echte leider</span><span class="cat">Vrijdag</span>
-
* /echo: insufficient parameters (line 22, script5.ini)
-
<span class="title">Echte voetbal zegeviert</span><span class="cat">Donderdag</span>
-
* /echo: insufficient parameters (line 22, script5.ini)
-
<span class="title">Ferguson lyrisch over Neuer</span><span class="cat">Woensdag</span>
-
* /echo: insufficient parameters (line 22, script5.ini)
-
<span class="title">Ajax laat Dost vallen en wil Matavz</span><span class="cat">Dinsdag</span>
-
* /echo: insufficient parameters (line 22, script5.ini)
-
<span class="title">Bayern wordt steeds gezelliger</span><span class="cat">Vrijdag</span>
-
* /echo: insufficient parameters (line 22, script5.ini)
-
<span class="title">Real Madrid verslaat Barcelona</span><span class="cat">Donderdag</span>
-
* /echo: insufficient parameters (line 22, script5.ini)
-
<span class="title">Van der Wiel voor 10 miljoen naar Bayern</span><span class="cat">Woensdag</span>
-
* /echo: insufficient parameters (line 22, script5.ini)

The /tokenize command didn't work. But this is not what I want, I want
Code:
/fc-knudde/1000709/popup.html
out of
Code:
<a href="#" onclick="NU.popup('/fc-knudde/1000709/popup.html','Cartoon','480','730'); return false;">
Posted By: Wims Re: Regular expressions help? - 03/05/11 08:39 PM
Quote:
But this is not what I want, I want

/fc-knudde/1000709/popup.html

out of

<a href="#" onclick="NU.popup('/fc-knudde/1000709/popup.html','Cartoon','480','730'); return false;">
$gettok(string,2,39)
Posted By: LMN Re: Regular expressions help? - 04/05/11 09:19 AM
Oh, it's a bit dumb that I didn't think of that myself smile
Thank you all very much, I have my final script now.
© mIRC Discussion Forums