如何使用正则表达式过滤textarea?

时间:2015-05-29 11:08:43

标签: javascript regex

顺便说一句:我知道使用正则表达式并不是世界上最好的主意...

例如,我有这样的输入变体:

<p>&nbsp; &nbsp; &nbsp;</p>

<p>&nbsp; &nbsp;</p>

<p>&nbsp;</p>

我希望检查我的输入,例如:<p>&nbsp;之外的所有数量(0,1或50)...

我写了这样的表达:

/[^<p>(\s*&nbsp;\s*)*<\/p>]/ig

似乎有效,但是!

例如我有这样的输入:

<p>&nbsp; &nbsp;t&nbsp;</p>

<p>&nbsp; &nbsp;tttt&nbsp;tttt</p>

并且它在想,它等于我的正则表达式......

不是个好主意......

我的正则表达式做错了什么? 或者有更好的方法可以解决这个问题?

3 个答案:

答案 0 :(得分:4)

假设您希望消除其中只有Observable.from(Collections.emptyList()) .compose(new Observable.Transformer<List<Object>, List<Object>>() { @Override public Observable<List<Object> call(Observable<List<Object>> source) { boolean isEmpty = observable.isEmpty().toBlocking().first(); if (isEmpty) { return backupObservable(); } else { return source; } } }); (或更多)的所有<P>'s:那么:

假设你有这个

nbsp;

假设黄色部分必须去:因为它里面包含var a='a<p>&nbsp; &nbsp;&nbsp;</p>c<p>&nbsp; &nbsp;&nbsp;</p>d<p>&nbsp;aa &nbsp;&nbsp;</p>e';

除了带有纯粹nbsps的有问题的P之外,你将被遗弃:

enter image description here

然后这段代码:

aa

将屈服:

a=a.replace(/(<p>.*?<\/p>)/g, function(match, p1 ) {
  if (/^<p>(\s*&nbsp;\s*)*<\/p>$/ig.test(p1)) 
  return '';
  else return p1;
})

如您所见 - 由于acd<p>&nbsp;aa &nbsp;&nbsp;</p>e

P标记未被删除

http://jsbin.com/cizidayeru/3/edit

答案 1 :(得分:1)

你的表达非常接近,你想:

.replace(/<p>(\s*&nbsp;\s*)+<\/p>/ig,'<p>&nbsp;</p>');

这将匹配<p>后跟\s*&nbsp;\s*一次或多次后跟</p>,并将其替换为<p>&nbsp;</p>

或者您是否只希望单个&nbsp;保留完全删除的倍数?在这种情况下,您需要:

.replace(/<p>\s*&nbsp;\s*(\s*&nbsp;\s*)+<\/p>/ig,'')

注意到您不应该使用正则表达式来处理HTML。 ; - )

修改

如果您只需要测试它,请使用:

/<p>(\s*&nbsp;\s*)+<\/p>/.test(string);

一个或多个并且:

/<p>\s*&nbsp;\s*(\s*&nbsp;\s*)+<\/p>/.test(string);

两个或更多。

答案 2 :(得分:0)

您可以在将DOM渲染到页面之前解析DOM中的HTML。这提供了一些好处,因为您不必在正则表达式中包含标记名。另外一个好处是您的段落元素可能包含其他属性,如类名,数据*信息或内联样式;这都将使你的正则表达式测试失败。

因为在添加到正文之前将其解析为DOM,所以第三个好处是您不必在正则表达式中查找&nbsp;,只需查找空格{{ 1}}(或与任何非空白字符相反)。

的jQuery

\s

然后,您可以使用var strText ='a<p>&nbsp; &nbsp;&nbsp;</p>c<p>&nbsp; &nbsp;&nbsp;</p>d<p>&nbsp;aa &nbsp;&nbsp;</p>e', $div = $('<div/>').html(strText), $p = $div.find('p'); var empty_paragraph_count = 0; $p.each(function(){ var $this = $(this); if ( /^\s*$/.test( $this.text() ) ){ empty_paragraph_count++; // uncomment this line if you want to remove the paragraph: // $this.remove(); } }); 自由地执行任何操作,$div.html();将显示有多少段落为空或只有空格。

香草

如果您正在寻找VanillaJS解决方案,您可以使用相同的方法:

empty_paragraph_count
相关问题