Entity
Entity

Reputation: 8202

How to make a . (any character) in a PHP regex pattern also match newline characters?

The . character in a PHP regex accepts all characters except a newline. What can I use to accept ALL characters, including newlines?

For example:

$text = <<<TEXT
foo
bar
TEXT;
preg_match('/.+/', $text, $match);
echo $match[0];

This returns foo, but I need the full string match to be returned as:

foo
bar

Upvotes: 28

Views: 54392

Answers (5)

steffen
steffen

Reputation: 16938

An important thing is missing here. [\s\S] matches one character, whereas a newline can be a character sequence. (Windows uses two characters: \r\n.) Neither . (with DOT_ALL modifier) nor [\s\S] will match the newline sequence. Best way to match any character or any newline is (.|\R), "everything except a newline or a newline". \R matches \n, \r and \r\n.

Upvotes: 0

Franco
Franco

Reputation: 717

The PHP Manual page for Dot states that:

If the PCRE_DOTALL option is set, then dots match newlines as well.

Upvotes: 0

gnomed
gnomed

Reputation: 5565

would

[.\n]+

not work?

How about (.|\n)+? I tested it and it seems to work.

I am quite sure this is the literal interpretation of exactly what you were asking for.

Upvotes: 1

Tomalak
Tomalak

Reputation: 338158

This is commonly used to capture all characters:

[\s\S]

You could use any other combination of "Type-X + Non-Type-X" in the same way:

[\d\D]
[\w\W]

but [\s\S] is recognized by convention as a shorthand for "really anything".

You can also use the . if you switch the regex into "dotall" (a.k.a. "single-line") mode via the "s" modifier. Sometimes that's not a viable solution (dynamic regex in a black box, for example, or if you don't want to modify the entire regex). In such cases the other alternatives do the same, no matter how the regex is configured.

Upvotes: 51

Vincent Savard
Vincent Savard

Reputation: 35927

It's the the . character that means "every character" (edit: OP edited). And you need to add the option s to your regexp, for example :

preg_match("`(.+)`s", "\n");

Upvotes: 12

Related Questions