in reply to Regular expression matching

Well this i think is more readable (IF in same line):
if (m#<P>(.+)</P># && $1=~m/<b>/) {}
But one regex could be this (i'm not sure which would be faster):
m#<P>(?!.+<b>)(.+)</P>#i
But as people noted above, html can be tricky since tags ba span multiple lines or be in same line. So be careful when doing pure regex handling on html.

Replies are listed 'Best First'.
Re^2: Regular expression matching
by bart (Canon) on Mar 17, 2004 at 10:42 UTC
    m#<P>(?!.+<b>)(.+)</P>#i
    Nope. That would fail to match on a string like "<P>This is fine.</P><P><b>next</b></P>".

    The next ought to work. It does a lookahead for the bad string "<b>" on every character it reconsiders matching, on the internal string.

    m#<P>(?:(?!<b>).)+?</P>#i
      True.

      Thats why i said that regex in pure html is not easy. I just had to go to eat, so didn't have time to refine it so that it does what you wrote :). I might have gone on route of the first way (more understandle and perhaps faster) eg.
      if (m#<P>(.+?)</P># && $1!~m/<b>/i)
      Oh, well ;).
      I submit:
      qr %<p>([^<]*(?:<(?!b>|/p>)[^<]*)*)</p>%i;
      and a benchmark. The solution with the lookahead on each character does much better than I expected:
      #!/usr/bin/perl use strict; use warnings; use Benchmark qw /cmpthese/; our $abigail = qr %<p>([^<]*(?:<(?!b>|/p>)[^<]*)*)</p>%i; our $bart = qr %<P>((?:(?!<b>).)+?)</P>%is; our $corion = qr %<p>((?:[^<]*|<(?!b>)[^>]+>)*?)</p>%i; my @names = qw /abigail bart corion/; our @data = <DATA>; my @correct = ('Just another perl hacker', 'this should match', 'What about <a href="http://www.example.com">this</a>?' +, 'And <p>this'); cmpthese -1 => {map {$_ => "\@$_ = map {/\$$_/g} \@data"} @names}; no strict 'refs'; "@$_" eq "@correct" or die ucfirst for @names; __DATA__ <P>Just another perl hacker</P> <P>Just <b>another</b> perl hacker</P> <p>this should match</p> <p>This should <b>not</b> match</p> <p>What about <a href="http://www.example.com">this</a>?</p> <p>And <p>this</p> malformed piece?</p> Rate corion bart abigail corion 6457/s -- -68% -72% bart 19910/s 208% -- -14% abigail 23209/s 259% 17% --

      Abigail