2010-11-15 6 views
1

je dois saisir le nom d'une balise html d'ancrage avec regex et php donc de texte que je vais obtenir « bonjour » (le nom de l'ancre)Obtenir le nom d'ancrage avec php regex

Essayé que:

$regex = '/(?<=name\=")#([^]+?)#(?=")/i'; 
preg_match_all($regex, $content, $data); 
print_r($data); 

J'ai coupé la queue le journal des erreurs apache pour savoir que:

PHP Warning: preg_match_all(): Compilation a échoué: manquant terminaison] pour la classe de caractères à décalage 26

aussi essayé:

$regex = '/(?<=name\=")([^]+?)(?=")/i'; 
$regex = '/(?<=name\=")[^]+?(?=")/i'; 

qui sont fondamentalement les mêmes. Je suppose que je me manque quelque chose, probablement une barre oblique stupide ou quelque chose comme ça, mais je ne suis pas sûr de ce que

Will apprécié toute aide Merci

SOLVED

Ok, Merci à @stillstanding et @Gordon j'ai réussi à le faire avec DOMDocument qui est beaucoup plus simple, donc, pour l'enregistrement, Voici le Snippet

$dom = new DOMDocument; 
    $dom->loadHTML($content); 
    foreach($dom->getElementsByTagName('a') as $node) { 
     echo $node->getAttribute('name'); 
    } 
+0

* (liés) * [meilleures méthodes pour analyser HTML] (http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662 # 3577662) – Gordon

+0

duplication possible de [Expression régulière pour saisir l'attribut href d'un élément A] (http://stackoverflow.com/questions/3820666/regular -expression-pour-saisir-l'-href-attribut-d'-un-un-élément) – Gordon

+0

Les utilisateurs PHP n'utilisent-ils pas le mode '/ x' pour que leurs patterns puissent être traités en ** mode non-insane **? Comment venir? – tchrist

Répondre

2

Utilisez DOMXPath pour cela avec DOMDocument ou SimpleXML. Mais n'utilisez jamais de motifs regex!

+0

Il est parfaitement possible d'utiliser des modèles ** SI ET SEULEMENT SI ** vous avez généré le langage de balisage vous-même, car vous pouvez donc être garanti à 100% qu'il se conforme à un sous-ensemble particulier de ce langage de balisage. Dans le cas général, c'est trop dur mais dans de nombreux cas spécifiques, c'est parfaitement acceptable. – tchrist

+0

Le problème est que je ne reçois pas une page html ou un fichier XML, mais seulement un bloc de contenu, c'est en fait ce qui obtient de la fonction wordpress get_the_Content(). Le balisage est à moi, je l'ai créé avec un filtre de contenu wordpress il sera toujours sous la forme de something. – TwoDiv

+0

@TwoDiv n'a pas d'importance. L'un des outils répertoriés dans le lien associé ci-dessous votre question peut fonctionner avec HTML partiel. Voir la question CloseVote pour un exemple de travail. Juste besoin d'échanger href avec le nom. Si vous êtes sûr que c'est toujours '' match '# #'. Devrait le rendre non-croyant cependant. – Gordon

0
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; 
preg_match($regex, $yourstring, $result); 

par exemple:

$yourstring="somelink.html#this"; 
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)"; 
preg_match($regex, $yourstring, $result); 
echo substr($result[0],1); 

reviendriez 'test'

Cependant, la fonction parse_rul est probablement un meilleur pari pour obtenir cette information d'une adresse:

http://www.php.net/manual/en/function.preg-match.php#96339

Si vous souhaitez remplacer l'ancho réel r tags dans un document, voir here

+0

Je pense que l'OP veut le contenu de l'attribut de nom d'un élément A et non le fragment d'une URL. – Gordon

0

Votre [^]+? est une erreur de syntaxe. Qu'est ce que c'est censé être? Une correspondance minimale d'une ou plusieurs instances, préférant moins, de quoi? Si vous voulez dire un nonmeta ^, alors vous devriez simplement l'appeler \^. Mais si vous voulez dire un personnage qui n'est pas ^, vous pouvez utiliser [^^], que vous pouvez écrire [^\^] si cela vous semble plus clair.

Si vous voulez dire pas au début de la ligne, eh bien, c'est un peu différent. Vous pourriez utiliser une négation lookbehind, peut-être. Mais plus d'informations sont nécessaires.

Si vous êtes vraiment lié et déterminé à utiliser a regex to split HTML tags, vous devriez au moins le faire correctement.

+0

Je suis assez moche dans Regex donc j'ai pris l'expration de http://gskinner.com/RegExr/. Il devrait avoir la propriété name. Cela a bien fonctionné sur l'émulateur regex mais pas sur php, j'ai compris que c'est parce que php utilise une légère syntaxe regex différente. – TwoDiv

+0

@TwoDiv: Oui, c'est le fléau des regex: qu'une syntaxe particulière fonctionnera, ou ne fonctionnera pas, différemment dans les différentes applications. Même si la plupart disent qu'ils sont dérivés de Perl, cela ne dit rien de l'histoire entière, ni ne les rend mutuellement compatibles, comme je vois que vous avez découvert. Espérons que PHP rattrape PCRE 8 un de ces jours, ce qui devrait aider. – tchrist

0

Ne fonctionnera que pour la chaîne <a name="[variable]"> exacte (chaîne, pas élément.Reggex n'a aucune idée des éléments, ni des attributs.Ils ne peuvent pas analyser HTML). Voir les liens ci-dessous votre question pour les approches alternatives.

$text = ' 
    <a name="anything">something</a> blabla 
    <span name="something">something</span> blabla 
    <a name="something else">something else</a> blabla 
'; 

preg_match_all('#<a name="(.*)">#', $text, $matches); 
print_r($matches); 

donne

Array 
(
    [0] => Array 
     (
      [0] => <a name="anything"> 
      [1] => <a name="something else"> 
     ) 

    [1] => Array 
     (
      [0] => anything 
      [1] => something else 
     ) 
) 

Marquer ce sujet parce que CW a été battu à mort