Cela fonctionne avec la mise en garde que regex ne doit pas être utilisé pour analyser xml/html, etc ..
Il est toujours plus facile de capturer des échantillons simples, puis les sous-processus dans un rappel.
Dans cette capture de cas ([alphabet "*`,] +), bande puis les caractères indésirables, puis faire une comparaison.
Un échantillon Perl, le concept est le même pour Perl/PHP/C#, etc. ..
$sample = '
<hw>Al"pha*bet</hw>
<hw>Al"pha*be`t</hw>
<hw>alphabet</hw>
<hw>al*pha*bet</hw>
<hw>al"pha"b"et</hw>
';
$specialword = 'alphabet';
$uc_specialword = uc($specialword);
while ($sample =~ m{<([A-Za-z_:][\w:.-]*)(?:\s+(?:".*?"|\'.*?\'|[^>]*?)+)?\s*(?<!/)>([$specialword"*`,]+)</\1\s*>}isg)
{
($matchstr, $checkstr) = ($&, $2);
$checkstr =~ s/["*`,]//g;
if (uc($checkstr) eq $uc_specialword) {
print "Found '$checkstr' in '$matchstr'\n";
}
}
regex élargi:
m{ # Regex delim
< # Open tag
([A-Za-z_:][\w:.-]*) # Capture 1, the tag name
(?:\s+(?:".*?"|\'.*?\'|[^>]*?)+)?\s* # optional attr/val pairs
(?<!/)
>
([alphabet"*`,]+) # Capture 2, class of special characters allowed, 'alphabet' plus "*`,
</\1\s*> # Close tag, backref to tag name (group 1)
}xisg # Regex delim. Options: expanded, case insensitive, single line, global
sortie:
Found 'Alphabet' in '<hw>Al"pha*bet</hw>'
Found 'Alphabet' in '<hw>Al"pha*be`t</hw>'
Found 'alphabet' in '<hw>alphabet</hw>'
Found 'alphabet' in '<hw>al*pha*bet</hw>'
Found 'alphabet' in '<hw>al"pha"b"et</hw>'
exemple de PHP
L'utilisation preg_match()
se trouvent ici http://www.ideone.com/8EBpx
<?php
$sample = '
<hw>Al"pha*bet</hw>
<hw>Al"pha*be`t</hw>
<hw>alphabet</hw>
<hw>al*pha*bet</hw>
<hw>al"pha"b"et</hw>
';
$specialword = 'alphabet';
$uc_specialword = strtoupper($specialword);
$regex = '~<([A-Za-z_:][\w:.-]*)(?:\s+(?:".*?"|\'.*?\'|[^>]*?)+)?\s*(?<!/)>([' . $specialword. '"*`,]+)</\1\s*>~xis';
$pos = 0;
while (preg_match($regex, $sample, $matches, PREG_OFFSET_CAPTURE, $pos))
{
$matchstr = $matches[0][0];
$checkstr = $matches[2][0];
$checkstr = preg_replace('/[" * `,]/', "", $checkstr);
if (strtoupper($checkstr) == $uc_specialword)
print "Found '$checkstr' in '$matchstr'\n";
$pos = $matches[0][1] + strlen($matchstr);
}
?>
L'utilisation preg_match_all()
peut être trouvée ici http://www.ideone.com/C6HeT
<?php
$sample = '
<hw>Al"pha*bet</hw>
<hw>Al"pha*be`t</hw>
<hw>alphabet</hw>
<hw>al*pha*bet</hw>
<hw>al"pha"b"et</hw>
';
$specialword = 'alphabet';
$uc_specialword = strtoupper($specialword);
$regex = '~<([A-Za-z_:][\w:.-]*)(?:\s+(?:".*?"|\'.*?\'|[^>]*?)+)?\s*(?<!/)>([' . $specialword. '"*`,]+)</\1\s*>~xis';
preg_match_all($regex, $sample, $matches, PREG_SET_ORDER);
foreach ($matches as $match)
{
$matchstr = $match[0];
$checkstr = $match[2];
$checkstr = preg_replace('/[" * `,]/', "", $checkstr);
if (strtoupper($checkstr) == $uc_specialword)
print "Found '$checkstr' in '$matchstr'\n";
}
?>
Avez-vous une langue particulière à l'esprit? Notez que ma première pensée serait de tirer les sous-chaînes étiquetées, d'éliminer ces caractères puis de les faire correspondre, mais cela peut ne pas être idéal selon votre langue ou votre jeu de données. –
ouais .. le meilleur moyen de faire ce genre de dépend de quelle langue et comment vous obtenez les données d'exemple pour commencer. Par exemple, si vous utilisez une classe d'analyseur xml (avec par exemple php), vous pouvez facilement saisir les tags avec des fonctions préfabriquées. Mais même s'il s'agissait de racler du contenu brut à l'aide d'une regex pure, il serait encore plus "propre" de supprimer les caractères spéciaux et ensuite de les comparer à "alphabet" ...esp depuis que j'ai une suspicion furtive "alphabet" est juste un mot d'exemple et vous appliquerez ceci à n'importe quel mot ... –
Exemples de chaînes que vous allez correspondre sur, la langue? Que voulez-vous faire correspondre: Le mot, les lignes, les tags (avec le contenu), ou un bloc complet tel que ci-dessus? – Qtax