2010-09-27 6 views
0

Je contiennent des données dans un fichier bloc-notes comme suit:Capitaliser la première lettre en PHP en utilisant RegEx?

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 

Je veux des données ci-dessus pour être mis à jour comme ci-dessous dans le fichier Bloc-notes:

<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 

Ce qui signifie l'ajout d'une étiquette <strong> ou toute autre balise avec le premier caractère par ordre alphabétique. Les données dans le fichier sont triées par ordre alphabétique (A à Z).

Je veux y parvenir en PHP en utilisant les techniques RegEx, s'il vous plaît aider!

Merci.

+3

J'espère que l'utilisation de regex n'est pas obligatoire? –

+0

J'ai aussi besoin de sa version RegEx, car je devrais utiliser ceci avec la routine GREP. – Prashant

+0

Quelqu'un a ajouté une réponse, mais l'a supprimée, je demande s'il vous plaît l'ajouter à nouveau, cela sera également utile pour l'atteindre en PHP. – Prashant

Répondre

3

je ferais quelque chose comme:

$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"; 
} 

Sortie:

<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

Vous pouvez le faire avec awk au lieu de grep à la ligne de commande:

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 (insensible à la casse):

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

Sortie:

<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 

Avec un tweak mineur, vous pouvez aussi éviter que l'impression de la première colonne redondante entièrement et résumer toutes les données sous la première occurrence:

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

Sortie:

<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 

Si cela est vraiment HTML, vous devriez probablement ajouter aussi dans vos <BR> tags.

Questions connexes