我想在此表中返回字符串
<tr class="rowodd" onclick="window.location.href='/portal/offers/show/entityId/32114';">
<td>01.10.2009</td>
<td>AN09551</td>
<td>[2009132] Ich bin Un. <a href="/portal/clients/show/entityId/762350"><myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a></td>
<td class="number" title="7.500,00 €">7.500,00 </td>
<td>Entwurf</td>
</tr>
我试过了这个:
#<tr>.*?<t.*?>(.*?)</t.*?>.*?<t.*?>(.*?)</t.*?>.*?<t.*?>(.*?)</t.*?>.*?</tr>#s
任何人都可以帮忙吗?
答案 0 :(得分:3)
正如许多人会指出的那样,你最好使用HTML / XML解析器(如this one)。 HTML不是常规的,如果你使用正则表达式,有许多边缘情况可以编码。
鉴于您只想提取文本,XPath可能会有所帮助。表达式如:
/tr/td/text()
可能会做到这一点。
答案 1 :(得分:1)
尝试:
// http://simplehtmldom.sourceforge.net/
include('simple_html_dom.php');
$str = '<tr class="rowodd" onclick="window.location.href=\'/portal/offers/show/entityId/32114\';">
<td>
01.10.2009
</td>
<td>
AN09551
</td>
<td>
[2009132] Ich bin Un. <a href="/portal/clients/show/entityId/762350">
<myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a>
</td>
<td class="number" title="7.500,00">
7.500,00
</td>
<td>
Entwurf
</td>
</tr>';
$html = str_get_html($str);
foreach($html->find('td') as $element) {
echo trim($element->innertext) . "\n";
}
输出:
01.10.2009
AN09551
[2009132] Ich bin Un. <a href="/portal/clients/show/entityId/762350">
<myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a>
7.500,00
Entwurf
答案 2 :(得分:1)
不要使用像.*?
这样的许多不明确的非贪婪表达式。虽然他们做你想做的事,但是他们会带来许多回溯,从而使你的整个表达效率低下。特别是当你使用这么多时。
尽量明确:
#<tr\b(?:[^"'>]*|"[^"]*"|'[^']*')*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
</tr\s*>#sx
但是如你所见,这是一团糟。
您应该更好地使用像DOMDocument那样的HTML解析器。然后你可以像Brian Agnew建议的那样使用XPath查询元素。这比正则表达式更可靠,更舒适。
答案 3 :(得分:0)
不是strip_tags
选项吗?
它会删除所有标签,只留下标签之间的文本。它也剥离了属性
在你的情况下,这将导致:
01.10.2009
AN09551
[2009132] Ich bin Un.
7.500,00 €
Entwurf
答案 4 :(得分:0)
否则使用正则表达式可以使用它(使用多行选项):
(?:\<td[^\>]*?\>([^\<]*?)\</td\>)+
但正如@Brian Agnew指出的那样,这就像xml / html解析器一样好......
答案 5 :(得分:0)
在PHP世界中,有preg_match_all,它比JS更容易。
$ptn = "/<\s*td[^>]*>([^<^>]*)</;
preg_match_all($ptn, $str, $matches);
print_r($matches);
中测试结果