регулярное выражение вставить тег, окружающий все цифры - PullRequest
0 голосов
/ 05 мая 2020

У меня есть документ с множеством таких строк:

<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>

)

Что мне нужно do это проверить, совпадают ли цифры из третьего и четвертого , игнорируя другие символы.

Для этого я пытаюсь выделить их с помощью , поэтому что их легче увидеть. Я запускаю эту замену sed:

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

Но он окружает только последний di git в каждой строке .

Может ли кто-нибудь помочь мне окружить ВСЕ комбинации цифр в 3-м и 4-м тегах?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

Если все, что вы хотите сделать, это сгенерировать версию HTML своей страницы с выделенными числами в определенных c столбцах, вы можете сделать что-то вроде:

$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.

Надеюсь, это поможет

0 голосов
/ 05 мая 2020

С sed и каждой строкой в ​​одной строке вам может повезти с

sed -r ':a;s#(.*</td>)(.*<td>)(.*[^\r[:digit:]])([[:digit:]]+)#\1\2\3<mark>\r\4</mark>#;ta;s/\r//g'

Вы не должны разбирать HTML с sed, поэтому это решение не стоит объяснять.

0 голосов
/ 05 мая 2020

Плохая идея использовать регулярные выражения для произвольных HTML, потому что SGML не являются регулярными. Для этого вам понадобится парсер HTML:

Parse. Найдите третий и четвертый дочерние элементы TD для TR и измените их текстовые дочерние элементы.

Возможно, вам удастся уйти с синтаксическим анализом известного HTML, если вам повезет, оставив всю строку неукрашенной перед преобразованием и подсчетом TD в вашем регулярном выражении.

(<tr[^<]+<td[^<]+<td[^<]+<td[^"]"\D*)(\d+)([^"]....)

\1<mark>\2</mark>\3

И то же самое для 4-го.

Но у вас есть проблемы, когда ваш текст содержит более одного блока цифр, который вы хотите «отметить».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...