-1

想不通,为什么我的正则表达式不仅发现了 alpha 字符?

图案:

([\<])([^\>]{1,})([a-zA-Z])([\>])

这个例子

-------- Original Message --------
Subject:    This is plain test
Date:   Tue, 04 Jun 2013 13:26:04 +0000
From:   Hello there <myemail@myemail.tld>
To:     myemail@myemail.tld <myemail@myemail.tld>

Hello! This is plain mail!
<SP@AN></SPA@N>
No html is inserted. No no!
<man2></man2>
Why do you found this < something inside this>???

表达式找到了电子邮件地址和无效的 html 标签!我需要,因此由于解析 html 有效标签的文本,因此不会匹配无效标签和电子邮件地址。这种模式有什么问题,为什么它匹配无效的标签和电子邮件?

这是我的测试的链接。http://regexr.com?353v9

4

4 回答 4

1

这个简单的应该适合您的需求:

</?[a-zA-Z0-9]+?>

演示

于 2013-06-04T15:47:43.347 回答
0

如果我理解你的问题是正确的,你想过滤掉像< > @ /

如果是这种情况,您可以使用它来^[^\<\>\/\\\'\"]*$匹配< > / \ ' ".

于 2013-06-04T14:29:12.947 回答
0

让我们分解您的正则表达式(组):

  1. ([\<])= 正好一个<
  2. ([^\>]{1,})=任何不是a 的字符>,一次或多次
  3. ([a-zA-Z])= 正好是一个小写或大写字母字符
  4. ([\>])= 正好一个>

<myemail@myemail.tld>这就是匹配电子邮件地址的原因:

  1. <
  2. myemail@myemail.tl
  3. d
  4. >

和类似标签的字符串,如<SPA@N>

  1. <
  2. SPA@
  3. N
  4. >

< something inside this>

  1. <
  2. something inside thi(包括开头的空格)
  3. s
  4. >

<man2>不匹配,因为2之前的数字>不是字母字符。

基本解决方案:要匹配典型的 HTML 标签,您可以使用([\<]\/?)([a-zA-Z0-9]+)([\>])

  1. ([\<]\/?)= 一<</(用于结束标签)
  2. ([a-zA-Z0-9]+)= 一个或多个字母数字(以支持<h2>等)字符 – HTML 元素名称
  3. ([\>])= 一>

请注意,这不支持像<br />or这样的 XHTML 空标签表示法<br/>,也不支持像<a href="http://example.com">. 有许多正则表达式资源,其中包含大量用于 HTML 标记、电子邮件地址验证等的模式。

编辑:如果您正在进行任何过滤,请确保不要只删除>字符,因为这些字符通常用于纯文本电子邮件中,以在回复时指示引用块。

于 2013-06-04T15:03:39.270 回答
0

第二组([^\>]{1,})找到一个或多个不是右尖括号的字符>——这包括字母、数字,以及所有不是>. 我相信这就是为什么您的比赛不是您所期望的;很难知道,因为你没有告诉你到底要匹配什么,模式匹配什么字符串,或者匹配有什么问题。

于 2013-06-04T14:27:45.793 回答