I need to change RichEditor and TextEditor modes with JavaScript, now I need to convert Html to Text which is actually still in Html editor mode, so I need just p tags, but other Html can be stripped off.
-
@JavaCoder: Thinking about it again, there is one situation that would make the regex break. See edited answer, and decide if this would apply to you.Tomalak– Tomalak2009-05-06 09:23:47 +00:00Commented May 6, 2009 at 9:23
-
Tomalak's answer would work in most situations, but please keep in mind that stripping HTML down to "safe" HTML is extremely difficult and has serious security implications. If you're sending the resulting HTML to the server, never count on client-side validataion. Even if you don't send it back to the server, building it based on GET or POST values can make security holes. Read up on XSS and CSRF.Neall– Neall2009-05-06 11:32:59 +00:00Commented May 6, 2009 at 11:32
3 Answers
Regex replace (globally, case-insensitively):
</?(?:(?!p\b)[^>])*>
with the empty string.
Explanation:
< # "<"
/? # optional "/"
(?: # non-capture group
(?! # negative look-ahead: a position not followed by...
p\b # "p" and a word bounday
) # end lock-ahead
[^>]* # any char but ">", as often as possible
) # end non-capture group
> # ">"
This is one of the few situations where applying regex to HTML can actually work.
Some might object and say that the use of a literal "<" within an attribute value was actually not forbidden, and therefore would potentially break the above regex. They would be right.
The regex would break in this situation, replacing the underlined part:
<p class="foo" title="unusual < title">
---------
If such a thing is possible with your input, then you might have to use a more advanced tool to do the job - a parser.
4 Comments
</?(?:(?!p\b)[^>])*>.*</p>This should help
var html = '<img src=""><p>content</p><span style="color: red">content</span>';
html.replace(/<(?!\s*\/?\s*p\b)[^>]*>/gi,'')
explanation for my regex:
replace all parts
- beginning with "<",
- not followed by (?!
- any number of white-space characters "\s*"
- optional "/" character
- and tag name followed by a word boundary (here "p\b")
- containing any characters not equal ">" - [^>]*
- and ending with ">" character