Rushen Bilgin
Rushen Bilgin

Reputation: 51

Javascript regular expression string-replacement of multi-line strings

With JavaScript regular expression replace, trying to replace anything between <head> and </head> tags so that:

<head>
   Multiline foo
</head>
<body>
  Multi line bar
</body>

gets replaced into:

<body>
  Multi line bar
</body>

and trying with the very basic: <head(.*)\/head>/m which doesn't work. It works fine when line breaks are removed from string. No matter what type of line breaks, what's the magic?

Upvotes: 4

Views: 2519

Answers (2)

Martin Jespersen
Martin Jespersen

Reputation: 26183

Alan is right, to summarize, use /<head([\s\S]*)\/head>/ and it should do what you wish.

The actual regex i'd use for the job is /<head>([\s\S]*?)<\/head>/ but the difference probably won't matter, since it just assures there is no greedy matching with a 2nd head tag that should never be there :)

Upvotes: 4

Alan Moore
Alan Moore

Reputation: 75222

The problem is that the dot metacharacter doesn't match newlines. In most regex flavors you can force it to match everything by setting "DOTALL" or "single-line" mode, but JavaScript doesn't support that. Instead, you have to replace the dot with something that does match everything. The most common idiom is [\s\S] ("any whitespace character or any character that's not whitespace").

Upvotes: 8

Related Questions