【发布时间】:2011-03-21 19:54:59
【问题描述】:
我在尝试编写非贪婪的正则表达式语句时遇到问题。
这是我的字符串:
<strong>name</strong><strong>address</strong>mailto:blabla@email.com
这是我的正则表达式查询:
<strong>(.*?)</strong>.*?([A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4})
问题是我需要地址,而不是字符串中的名称。所以我需要正则表达式查询是非贪婪的,并采用最近的<strong></strong> 而不是最远的。
在我的搜索字符串中也有多个 this 实例,所以它必须一次匹配多个实例,而不是在它前面添加一个 .*(贪婪)。
所以它必须匹配这个的所有实例,并提取地址,而不是名称:
<strong>name</strong><strong>address1</strong>mailto:blabla@email.com
<strong>name</strong><strong>address2</strong>mailto:blabla@email.com
<strong>name</strong><strong>address3</strong>mailto:blabla@email.com
<strong>name</strong><strong>address4</strong>mailto:blabla@email.com
提前致谢!
【问题讨论】:
-
HTML+RegEx=Sh*t-storm 正在酝酿中。准备“不要使用正则表达式”答案/cmets。 -- 另一方面,我不确定我是否 100% 理解这个问题。您也可以提供示例捕获吗? (也许在您的正则表达式末尾添加
$是您正在寻找的?) -
是的,我只是在寻找关于那个布拉德主题的好帖子,哈哈。雪人,建议你使用 phpquery code.google.com/p/phpquery,因为它可以像 jquery 一样遍历 DOM。
-
@Jason:PHP 已经有了DOMDocument。 ;-)
-
@Brad,“phpquery”库提供了许多普通 DOM 中缺少的选择器快捷方式。
-
我认为尝试的解决方案的问题在于它尝试“反向”应用非贪婪匹配,从而迫使
<strong>/</strong>pair 匹配到最右边可以在邮件地址之前。但这不是非贪婪匹配的工作方式。对于快速而肮脏的解决方案,我只使用[^<]*而不是.*?- 因为<在HTML 中是非法的,除了开始一个标签,它将匹配地址字段的任何合法内容,但是防止它与标签匹配。
标签: php regex regex-greedy