2012-10-21 161 views
0

欲从包含HTML内容中,(<a><span>标记)的第一次出现之间的文本字符串中提取。正则表达式模式匹配

我的模式是如下:

$pattern='/<a[^(span)][\/\(\)-:@!%*>#=_|?$&";.\w\s]+<\/a> <span/um'; 

我得到的输出为<a月1日发生的<span末次出现和两个第一次发生之间没有文本之间的文本。

例如,HTML内容:

<a href="#">asdasdasd</a> <span blah blah></span> blah blah <a>blah </a> <span>blah 

旺旺:

<a href="#">asdasdasd</a> <span 

获取:

<a href="#">asdasdasd</a> <span blah blah></span> blah blah <a>blah </a> <span 
+0

我知道这不会回答你的问题,我会建议不要使用正则表达式解析HTML。为什么不尝试这样的事情[DOM解析器(http://simplehtmldom.sourceforge.net/),并节省一些时间。 – noel

+0

使用合适解析器。 –

+0

知道DOM解析器,但使用正则表达式的原因必须在分配。学习正则表达式。 –

回答

1
  1. 使用HTML解析器解析HTML
  2. 使用懒惰量词'/<a[^(span)][\/\(\)-:@!%*>#=_|?$&";.\w\s]+?<\/a> <span/um';
+0

感谢哥们.. !!帮助... !!新的正则表达式 –

0

你需要做的正则表达式懒惰,而不是贪婪告诉它与.+?<a<span尽可能之间尽可能少的字符匹配:

$ptn = '/<a.+?<span/'; 
$str = '<a href="#">asdasdasd</a> <span blah blah></span> blah blah <a>blah </a> <span>blah'; 
preg_match($ptn, $str, $matches); 
echo $matches[0]; 

结果是<a href=\"#\">asdasdasd</a> <span

+0

谢谢哥们.. !!帮助... !!新的正则表达式 –