Прописать первую букву в PHP, используя RegEx? - PullRequest
0 голосов
/ 27 сентября 2010

У меня есть данные в файле блокнота следующим образом:

A   1-6
A   1-7
B   1-8
B   1-9
B   1-10
c   1-11
C   1-12
D   1-13
F   1-14
F   1-15
f   1-16

Я хочу обновить вышеуказанные данные, как показано ниже в файле блокнота:

<strong>A</strong>  1-6
A   1-7
<strong>B</strong>  1-8
B   1-9
B   1-10
<strong>c</strong>  1-11
C   1-12
<strong>D</strong>  1-13
<strong>F</strong>  1-14
F   1-15
f   1-16

Что означает добавление тега <strong> или любого другого тега с первым символом в алфавитном порядке. Данные в файле отсортированы в алфавитном порядке (от А до Я).

Я хочу добиться этого в PHP, используя методы RegEx, пожалуйста, помогите!

Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 сентября 2010

Я бы сделал что-то вроде:

$seen = array();
$file = array(
'A   1-6',
'A   1-7',
'B   1-8',
'B   1-9',
'B   1-10',
'c   1-11',
'C   1-12',
'D   1-13',
'F   1-14',
'F   1-15',
'f   1-16'
);
foreach($file as $line) {
    $L = strtoupper(substr($line, 0, 1));
    if (!isset($seen[$L])) {
        $line = preg_replace('!^(.)!', "<strong>$1</strong>", $line);
        $seen[$L] = 1;
    }
    echo $line,"\n";
}

Выход:

<strong>A</strong>   1-6
A   1-7
<strong>B</strong>   1-8
B   1-9
B   1-10
<strong>c</strong>   1-11
C   1-12
<strong>D</strong>   1-13
<strong>F</strong>   1-14
F   1-15
f   1-16
1 голос
/ 28 сентября 2010

Вы можете сделать это с awk вместо grep в командной строке:

example.file:

A   1-6
A   1-7
B   1-8
B   1-9
B   1-10
c   1-11
C   1-12
D   1-13
F   1-14
F   1-15
f   1-16

AWK (без учета регистра):

cat example.file | awk 'BEGIN {last=""} {if (tolower($1) != last) printf "<b>"$1"</b>"; else printf $1; print " "$2;last=tolower($1)}'

Выход:

<b>A</b> 1-6
A 1-7
<b>B</b> 1-8
B 1-9
B 1-10
<b>c</b> 1-11
C 1-12
<b>D</b> 1-13
<b>F</b> 1-14
F 1-15
f 1-16

С незначительной настройкой вы также можете просто избежать печати первого избыточного столбца целиком и суммировать все данные за первым появлением:

cat t | awk 'BEGIN {last=""} {if (tolower($1) != last) print "<b>"$1"</b>"; print $2;last=tolower($1)}'

Выход:

<b>A</b>
1-6
1-7
<b>B</b>
1-8
1-9
1-10
<b>c</b>
1-11
1-12
<b>D</b>
1-13
<b>F</b>
1-14
1-15
1-16

Если это действительно HTML, вам, вероятно, также следует добавить теги <BR>.

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