#1
  1. No Profile Picture
    Spontaneously Present
    Devshed Beginner (1000 - 1499 posts)

    Join Date
    Jul 2005
    Posts
    1,149
    Rep Power
    0

    Help with lookbehind assertion and fixed width


    ok how do i make a variable length lookbehind in php?

    php Code:
     
    (?<![\s]*to[\s]*)

    http://www.perl.com/doc/manual/html/pod/perlre.html
    Last edited by mwild8; September 9th, 2008 at 08:09 PM.
  2. #2
  3. Did you steal it?
    Devshed Supreme Being (6500+ posts)

    Join Date
    Mar 2007
    Location
    Washington, USA
    Posts
    14,007
    Rep Power
    9398
    [edit] You can't do variable-length negative lookbehinds. At least not in PHP.
  4. #3
  5. No Profile Picture
    Spontaneously Present
    Devshed Beginner (1000 - 1499 posts)

    Join Date
    Jul 2005
    Posts
    1,149
    Rep Power
    0
    no that wont work.

    you get this

    [09-Sep-2008 19:35:45] PHP Warning: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Compilation failed: lookbehind assertion is not fixed length at offset 104

    in the link i provided

    (?=pattern)

    A zero-width positive lookahead assertion. For example, /\w+(?=\t)/ matches a word followed by a tab, without including the tab in $&.

    (?!pattern)

    A zero-width negative lookahead assertion. For example /foo(?!bar)/ matches any occurrence of ``foo'' that isn't followed by ``bar''. Note however that lookahead and lookbehind are NOT the same thing. You cannot use this for lookbehind.

    If you are looking for a ``bar'' that isn't preceded by a ``foo'', /(?!foo)bar/ will not do what you want. That's because the (?!foo) is just saying that the next thing cannot be ``foo''--and it's not, it's a ``bar'', so ``foobar'' will match. You would have to do something like /(?!foo)...bar/ for that. We say ``like'' because there's the case of your ``bar'' not having three characters before it. You could cover that this way: /(??!foo)...|^.{0,2})bar/. Sometimes it's still easier just to say:

    if (/bar/ && $` !~ /foo$/)

    For lookbehind see below.

    (?<=pattern)

    A zero-width positive lookbehind assertion. For example, /(?<=\t)\w+/ matches a word following a tab, without including the tab in $&. Works only for fixed-width lookbehind.

    (?<!pattern)

    A zero-width negative lookbehind assertion. For example /(?<!bar)foo/ matches any occurrence of ``foo'' that isn't following ``bar''. Works only for fixed-width lookbehind.
    i kind of get it, but its still sinking in. looking for a clear answer as to why i cant make it a variable length i.e. your solution

    i dont understand
    cover that this way: /(??!foo)...|^.{0,2})bar/. Sometimes it's still easier just to say:

    if (/bar/ && $` !~ /foo$/)
  6. #4
  7. Did you steal it?
    Devshed Supreme Being (6500+ posts)

    Join Date
    Mar 2007
    Location
    Washington, USA
    Posts
    14,007
    Rep Power
    9398
    My first reply was because I had flipped the ! and > in my head. I saw (?!< (non-capturing, has a <) instead of the (?<! (negative lookbehind) you posted. Thus the edit.

    It's just a limitation of the engine, which PHP copied to some extent. There's just no support for that kind of thing.
  8. #5
  9. No Profile Picture
    Spontaneously Present
    Devshed Beginner (1000 - 1499 posts)

    Join Date
    Jul 2005
    Posts
    1,149
    Rep Power
    0
    yea i understand the logic behind the no support.

    basically its fine for a lookahead because it goes until the end. but a lookbehind has the opportunity for an endless recursion loop. meaning i could box it inbetween two "to"

IMN logo majestic logo threadwatch logo seochat tools logo