0

我有 3 个正则表达式模式,可将网站 (bit.ly/1cjZR29) 解析为更好的形式:

$line[$item] = preg_replace("/\<(td|th|table|tr|div)(.*?)\>/", "|", $line[$item]);
$line[$item] = preg_replace("/\<\/(td|th|table|tr|div)\>/", "|", $line[$item]);
$line[$item] = preg_replace("/(.)\\1{3,}/sS", '$1', $line[$item]);

我想将它们一起加入 1 行。

当我尝试

$line[$item] = preg_replace("/\<(td|th|table|tr|div)(.*?)\>(.*)\<\/(td|th|table|tr|div)\>/", "|", $line[$item]);

它无法匹配任何东西。第三行用于删除空格。有谁能够帮我?谢谢指教。

4

2 回答 2

2

您不应该真正使用正则表达式来解析 HTML。您可以使用一些解析器,例如PHP Simple DOM Parser来执行此操作,原因与@Marty Wallace 建议的相同。

此外,您的正则表达式已经相对复杂,尝试合并它们只会使其成为维护的噩梦。

于 2013-08-02T07:44:49.093 回答
1

您可以结合前 2 条规则来获取标签之间的内容,空格可能会变得棘手。您可以有条件匹配,但不能在单个规则中进行条件替换。所以你可以说匹配一个html标签或多余的空格并用这个替换,但是你不能说html标签何时替换为这个,当空格替换为那个......你能做的最好的就是直接检查空格标签之前或之后。

$test = preg_replace("/\s*(<(table|tbody|tr|td|th|div)(.*?)>)*\s*([^<\s]+)\s*(<\/(table|tbody|tr|td|th|div)>)*\s*/m", "| $4 |", $test);

使用您提供的链接,我获取了排名表的 html,并且能够获得我认为您正在寻找的内容..

| 排名 || 等级 || 姓名 || 剩余时间 || 种族 || 1 || 302 || 正能量 || 220.301.329 || 爱电 || 2 || 302 || ……

但这不会处理值内部多余的空格,例如“Remain”和“Exp”之间有3个空格,我发现开始标签之间的空格很好,但最后一个或标签中的空格</td>没有</tr>正确</table>处理. 它还会错误处理不匹配的标签,例如<a>. 这就是他们告诉您使用解析器的原因,因为除非您可以严格控制 html 源代码,否则它可能会给您带来麻烦。但是,如果它是一个快速的一次性 html 抓取或某些(非生产)情况,其中添加一个完整的框架将是矫枉过正,不要让这阻止你练习你的正则表达式。

我发现的另一个轻松删除 html 标签的技巧是使用 jQuery 访问元素内部 html 并使用该.text()函数去除标签。如果您不需要处理文本服务器端,您可能会考虑

示例:JsFiddle

于 2013-08-02T10:35:19.727 回答