从表中的每个第一个 TD 中提取内容
我有一些如下所示的 HTML:
<tr class="row-even">
<td align="center">abcde</td>
<td align="center"><a href="deluserconfirm.html?user=abcde"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>
<tr class="row-odd">
<td align="center">efgh</td>
<td align="center"><a href="deluserconfirm.html?user=efgh"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>
<tr class="row-even">
<td align="center">ijkl</td>
<td align="center"><a href="deluserconfirm.html?user=ijkl"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>
我需要检索值 abcde
、efgh
和 ijkl
这是正则表达式我目前正在使用:
preg_match_all('/(<tr class="row-even">|<tr class="row-odd">)<td align="center">(.*)<\/td><\/tr>/xs', $html, $matches);
是的,我不太擅长它们。与我的大多数正则表达式尝试一样,这是行不通的。谁能告诉我为什么?
此外,我了解 html/xml 解析器,但需要重新访问大量代码才能实现这一点。那是以后的事情了。我们现在需要坚持使用正则表达式。
编辑:为了澄清,我需要第一个
标记之间的值 或
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
注意
m
修饰符以及\s*
的使用。另外,您可以通过
?:
使第一组不捕获。即(?:even|odd)
因为您可能对class
属性不感兴趣:)Notice the
m
modifier and the use of\s*
.Also, you can make the first group non-capturing via
?:
. I.e.,(?:even|odd)
as you're probably not interested in theclass
attribute :)试试这个:
所做的更改:
标签之间
将丢弃正则表达式中的空格。
.*?
代替.*
。工作链接
Try this:
Changes made:
between the tags
will discard the space in the regex.
.*?
in place of.*
.Working link
实际上,您不需要对代码库进行太大的更改。使用 DOM 和 XPath 获取文本节点始终相同。唯一发生变化的是 XPath,因此您可以将 DOM 代码包装到一个函数中来替换
preg_match_all
。这只是一个微小的变化,例如dom.php 只包含:
并将返回
但如果您想要正则表达式,请使用正则表达式。我只是提供想法。
Actually, you dont need a too big change in your codebase. Fetching Text Nodes is always the same with DOM and XPath. All that does change is the XPath, so you could wrap the DOM code into a function that replaces your
preg_match_all
. That would be just a tiny change, e.g.where dom.php just contains:
and would return
But if you want a Regex, use a Regex. I am just giving ideas.
这是我想出来的,
我会解释一下。这里的挑战之一是标签之间的内容可能是您正在查找的文本,也可能是标签。在正则表达式中,[^<]+ 表示匹配不是 的一个或多个字符。特点。这很好,因为这意味着不会匹配,并且组只会匹配,直到找到标签。
This is what I came up with
I'll explain. One of the challenges here is what's between the tags could be either the text you're looking for, or an tag. In the regex the [^<]+ says to match one or more characters that is not the < character. That's great, because that means the won't match, and the the group will only match until the tag is found.
免责声明:使用正则表达式解析 HTML 是危险的。
要获取每个 TR 中第一个 TD 的内部html,请使用以下正则表达式:
Disclaimer: Using regexps to parse HTML is dangerous.
To get the innerhtml of the first TD in each TR, use this regexp:
这只是一个快速而肮脏的正则表达式来满足您的需求。它可以很容易地清理和优化,但这只是一个开始。
这是另一种方法,可能更可靠:
This is just a quick and dirty regex to meet your needs. It could easily be cleaned up and optimized, but it's a start.
Here is an alternative way, which may be more robust: