Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Regx to remove all characters after a match

2 views
Skip to first unread message

Duke of Hazard

unread,
Apr 17, 2008, 11:23:23 PM4/17/08
to
I can not figure out why this is not printing just 123:

$name = "123\n456\n789";

$name =~ s/\n.*//;

print $name;

which outputs:

123
789

If I write it in php using preg_replace , it works!

John W. Krahn

unread,
Apr 18, 2008, 12:30:16 AM4/18/08
to
Duke of Hazard wrote:
> I can not figure out why this is not printing just 123:
>
> $name = "123\n456\n789";
>
> $name =~ s/\n.*//;
>
> print $name;
>
> which outputs:
>
> 123
> 789

That is because . matches any character *except* newline. If you want
it to match a newline as well then you have to use the /s option:

$name =~ s/\n.*//s;


John
--
Perl isn't a toolbox, but a small machine shop where you
can special-order certain sorts of tools at low cost and
in short order. -- Larry Wall

Eric Amick

unread,
Apr 18, 2008, 12:37:22 AM4/18/08
to

By default, '.' in Perl regexes does not match newline. If you want it
to match newline, use

$name =~ s/\n.*//s;

I don't know PHP, but it surprises me that it handles that case
differently.
--
Eric Amick
Columbia, MD

Gunnar Hjalmarsson

unread,
Apr 18, 2008, 4:12:43 AM4/18/08
to

A bug in PHP?

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl

Abigail

unread,
Apr 18, 2008, 5:45:28 AM4/18/08
to
_
Gunnar Hjalmarsson (nor...@gunnar.cc) wrote on VCCCXLIV September
MCMXCIII in <URL:news:66r3c2F...@mid.individual.net>:
~~ Eric Amick wrote:
~~ > On Thu, 17 Apr 2008 20:23:23 -0700 (PDT), Duke of Hazard
~~ > <squ...@peoriadesignweb.com> wrote:
~~ >
~~ >> I can not figure out why this is not printing just 123:
~~ >>
~~ >> $name = "123\n456\n789";
~~ >>
~~ >> $name =~ s/\n.*//;
~~ >>
~~ >> print $name;
~~ >>
~~ >> which outputs:
~~ >>
~~ >> 123
~~ >> 789
~~ >>
~~ >> If I write it in php using preg_replace , it works!
~~ >
~~ > By default, '.' in Perl regexes does not match newline. If you want it
~~ > to match newline, use
~~ >
~~ > $name =~ s/\n.*//s;
~~ >
~~ > I don't know PHP, but it surprises me that it handles that case
~~ > differently.
~~
~~ A bug in PHP?


It would do what the OP intended in Perl6 as well.


Abigail
--
tie $" => A; $, = " "; $\ = "\n"; @a = ("") x 2; print map {"@a"} 1 .. 4;
sub A::TIESCALAR {bless \my $A => A} # Yet Another silly JAPH by Abigail
sub A::FETCH {@q = qw /Just Another Perl Hacker/ unless @q; shift @q}

Gunnar Hjalmarsson

unread,
Apr 18, 2008, 7:43:10 AM4/18/08
to

Maybe so, but the PHP docs say:

".
match any character except newline (by default)"

And still:

$ cat test.php
#!/usr/bin/php
<?php echo preg_replace('/\n.*/', '', "123\n456\n789") ?>
$ ./test.php
Content-type: text/html
X-Powered-By: PHP/4.3.3

123
$

0 new messages