/<table['s]+cellspacing="0"['s]+class="cj(?:.*?)"['s]+id="(?:.*?)">(?:.*?)value="(.*?)"(?:.*?)<td['s]+class="dep">(.*?)<'/td>(?:.*)(?:<td['s]+class="arr">(.*?)<'/td>)+(?:.*?)<'/table>/
这是我当前的正则表达式字符串,在 PHP 中使用 preg_match_all()
.我用(?:.*)
替换了(?:.*?)
,这样它就不会得到第一个<td>
class="dep"
,而是得到最后一个。现在,这非常有效,除非有多个表,在这种情况下,它会从整个解析的字符串中获取最后一个<td>
class="dep"
。谁能帮助我了解我做错了什么?
另外,我知道我应该使用XML解析,但这对我来说似乎太复杂了:P
编辑:另外,我真正想要的是第一个</table>
标签之前的<td>
。
这个简单的模式
$pattern = "#<table's.*?>.*?<td's.*?class=['"']dep['"'].*?>(.*?)</td>.*?</table>#i";
从主题字符串中的每个表中返回第一个匹配的对<td...class="dep"...>
和</td>
标记中的数据(无论您有多少个表(。
这是不区分大小写的搜索,它也会匹配类名(class="dep"
或class='dep'
(周围的单引号和双引号。
注意:如果您在单个表中有更多带有class="dep"
<TD>
标签,则此模式将返回该类TD对首次出现的数据。
示例代码将是这样的
$pattern = "#<table's.*?>.*?<td's.*?class=['"']dep['"'].*?>(.*?)</td>.*?</table>#i";
$document = ''; // put here your subject string
preg_match_all($pattern, $document, $results);
print_r($results[1]);
干杯!
最终通过获取一个正则表达式的表,然后用另一个正则表达式解析其内容来修复它。