首页 > 解决方案 > 正则表达式插入所有数字周围的标签

问题描述

我有一个包含许多这样的行的文档:

<tr><td width="10%">doc_no_320F0321</td><td width="5%">116</td><td> bla bla bla 1976, bla bla point (2) bla bla bla. </td><td> bla bla bla 1976, bla bla point (1) bla bla bla. </td></tr>

(美化后它看起来像这样:

<tr>
    <td width="10%">doc_no_320F0321</td>
    <td width="5%">116</td>
    <td> bla bla bla 1976, bla bla point (2) bla bla bla. </td>
    <td> bla bla bla 1976, bla bla point (1) bla bla bla. </td>
</tr>

)

我需要做的是检查第三个和第四个 < td > 的数字是否相同,忽略其他字符。

为此,我尝试用 <mark> 突出显示它们,以便更容易看到它们。我正在运行这个 sed 替换:

sed -i -r 's|(<td>.*?)([[:digit:]]+)(.*?<\/td>)|\1<mark>\2<\/mark>\3|g'

它只围绕每一行的最后一位数字

有人可以帮我把第三个和第四个标签中的所有数字组合都包围起来吗?

谢谢。

标签: htmlregexsed

解决方案


如果您只想生成页面的 HTML 版本,并在特定列中突出显示数字,您可以执行以下操作:

$d = new DOMDocument();
$d->loadHTMLFile('your_file_path.html');

$x = new DOMXpath($d);
$third_td = $x->evaluate('//tr/td[3]');
$fourth_td = $x->evaluate('//tr/td[4]');

$pattern = '/\d/';
$replace = '<span style="color: red;">${0}</span>';

foreach ( $third_td as $key => $input ) {
    $input->nodeValue = preg_replace($pattern, $replace, $input->nodeValue);
    $fourth_td[$key]->nodeValue = preg_replace($pattern, $replace, $fourth_td[$key]->nodeValue);
}

echo $d->saveHTML();

结果$d->saveHTML()是一个 HTML 版本,其中第 3 列和第 4 列中的所有数字都以红色着色。如果这是您需要的,可以相应地更改样式。

我没有考虑处理任何可能导致错误的缺失列或其他不兼容问题。

这段代码是用 PHP 编写的,基于 @Toto 的建议。

希望这可以帮助


推荐阅读