[drupal-support] Block path--block a specific node

Bèr Kessels berdrupal at tiscali.be
Sat Apr 30 10:48:28 UTC 2005


Djun, 
What an exellent post! I have been coding PHP for years, but never have i read 
such a simple yet complete introduction to regexps. 
Would you mind posting this on drupal.org, in the handbook? I can do it for 
you, but then the credits (username) would go to me. I would not want that. 
Also, consider adding the original question in that bookpage, so that we can 
list it as FAQ too. 

Bèr

Op zaterdag 30 april 2005 09:53, schreef puregin:
> On 29 Apr 2005, at 8:33 AM, Andrew Cohill wrote:
> > I'm baffled....I have reviewed the Drupal guide on the site and read
> > through numerous postings from the archive of this list, and have
> > tediously tested many alternate paths.
> >
> > I currently have this path (which works)
> >
> > <^(?!event)>
> >
> > it used to to keep certain blocks off the month view of the calendar.
> >
> > I want to add to that string something that does not display a block on
> > a specific page (e.g.  node/635)
> >
> > I tried
> >
> > <^(node/635)|^(?!event)>  (did not work)
> > <(^node/635)|^(?!event)>  (did not work)
> >
> > I'm not sure I am using the vertical bar  |  correctly.  I had trouble
> > finding examples of multiple paths.
> >
> > I am also not specifying the node/635 correctly, as I could not get to
> > work even when I removed the second part
> > ^(?!event)
> >
> > Thanks,
> > Andrew
>
> Hi Andrew,
>
>       I can empathize with your situation!  This is one of the most
> powerful,
> but also one of the most difficult, aspects of the block mechanism in
> Drupal.
>
>      Both power and difficultly spring from the same source - *regular
> expression syntax*.  There are entire books on the subject, so please
> don't feel stupid!  It really is pretty heavy going.
>
>     You'll want to place the entire regular expression in angle brackets,
> as in your examples.
>
>      The caret (^) *anchors* your regular expression to the start of a
> line,
> that is, the part of the URL immediately following the hostname.
>
>      Hence <^node> will match http://www.example.com/node,
> http://www.example.com/node/foo, and http://www.example.com/node/123,
> if your server is www.example.com.
>
>      If you omit this and type <node> for example, your regular
> expression
> will match http://www.example.com/node, but also
> http://www.example.com/nodessert,
> http://www.example.com/blog/how_to_delete_a_node, etc.
>
>      OK so far?
>
>      As you have perceived, parentheses *group* sub-expressions (sort of
> in the
> same way that parentheses group sub-expressions in arithmetic, or even
> in
> written communication, as in this example!).  The 'pipe' operator (|)
> is used
> to separate alternatives.  Read it as 'or'.  So,
>
>      <^(foo)|(bar)>
>
> can be read as 'match foo or bar at the start of the line'.
>
>     The expression (?!...) is called a negative look-ahead operator.  It
> says to match
> only if the subexpression following the ?! does not match from the
> point where
> the ?! is evaluated (matched)
>
>     So <^foo(?!(t))> matches http://www.example.com/fool and
> http://www.example.com/fooze
> but not http://www.example.com/foot, or http://www.example.com/football.
>
>     One more thing - letters and numbers 'match themselves', but
> obviously certain
> other special characters have special meaning (e.g., we've already seen
> that ^,?, !, | and parentheses are treated specially).  These are
> called *metacharacters*.
> To match a metacharacter you need to 'escape' it, by preceding it with
> a '\' (backslash).
> So, to match the pattern 'foo?!'  you'd have to type <foo\?\!>.
>
>     Now, we can put all of the pieces together.  Just as in arithmetic,
> or in writing
> compound sentences, you can create long expressions by combining short
> ones.
> Regular expressions can be combined by simply catenating them:
> <foo> matches 'foo', and <bar> matches 'bar'; catenate them to get
> <foobar> matching 'foobar'.  You can also combine by alternation:
> <(foo)|(bar)> matches foo or bar.  You can specify that a subexpressions
> matches zero or more times by following it with an asterisk:
> <(foo)*t> matches 't', foot, foofoot, foofoofoot, and so on.  (I've
> omitted
> the server part of the URL for brevity)
>
>    On to your example:
>
>      <^(?!(node\/635)|(event))>
>
> matches (at the beginning of the line) anything that doesn't match the
> subexpression following ?!, namely, node/635, or event.  I've escaped
> the slash - I don't know if this is necessary (but it doesn't hurt - any
> regular character when escaped just matches itself)
>
>      If you're beginning to love this stuff, there's hundreds of more
> pages
> of fun examples in various books and on other websites (for example
> at http://www.php.net).  Just search for 'regular expression' or
> PCRE (perl compatible regular expressions)
>
>      Hope this helps,
>
>      Djun
Regards,
 Bèr
-- 
 [ Bèr Kessels | Drupal services www.webschuur.com ]



More information about the drupal-support mailing list