8
votes

PHP Simple HTML DOM Parser Trouver une chaîne

J'utilise PHP Simple Dom Parser, mais il ne semble pas avoir la fonctionnalité de recherche de texte. Je dois rechercher une chaîne et trouver l'identifiant parent pour cela. Essentiellement l'inverse de l'utilisation normale.

Quelqu'un sache comment?


0 commentaires

4 Réponses :


3
votes
$d = new DOMDocument();
$d->loadXML($xml);
$x = new DOMXPath($d);
$result = $x->evaluate("//text()[contains(.,'617.99')]/ancestor::*/@id");
$unique = null;
for($i = $result->length -1;$i >= 0 && $item = $result->item($i);$i--){
    if($x->query("//*[@id='".addslashes($item->value)."']")->length == 1){
        echo 'Unique ID is '.$item->value."\n";
            $unique = $item->value;
        break;
    }
}
if(is_null($unique)) echo 'no unique ID found';

9 commentaires

Ceci est DOMDOCUMUMUMUMUMUMUMUME SIMPLEHTMLDOM Library alors que l'OP a déclaré qu'il utilisait .


ACK, a raté cela. Je ne peux toujours pas avoir la tête autour des gens en utilisant cette chose lente et lente, mais vous avez raison, ce n'est pas la réponse à la recherche de l'OP.


J'ai essayé cette réponse ... mais Domdocument crache beaucoup d'erreurs ... Cela semble très difficile à propos du HTML ... mais vous avez raison simple HTML Parser est un vrai porc de mémoire. Y a-t-il de toute façon pour que cela joue mieux avec un HTML mal formé?


Bien sûr, il y a, avant de charger, définir $ D-> récupérer = true; $ D-> stricterrorchecking = false; , et bien sûr, utiliser loadhtml () au lieu de < Code> loadxml () pour HTML. Si vous obtenez toujours de nombreuses erreurs, que vous ne pouvez pas ignorer (jamais afficher les erreurs sur les sites de production), vous pouvez définir libxml_use_internal_errors (true); pour les gérer séparément d'autres erreurs PHP.


Ack, wrapper n'est pas ce que nous voulons :). Mon mauvais, mon xpath est un peu rouillé, essayez // text () [contient (., '617.99')] / Parent :: * / @ ID , semble travailler ici.


Fonctionne un régal ... À l'exception des avertissements ... Y a-t-il de toute façon pour vérifier si cet identifiant est unique?


Les avertissements peuvent être désactivés par l'une ou l'autre des @ ( @ $ D-> loadhtml ($ html); , qui est un peu diabolique ou en utilisant libxml_use_internal_erors (vrai); $ D-> loadhtml ($ html); libxml_ clear_errors (); (préféré IMHO). Un identifiant devrait être unique, mais nous savons tous que ce n'est parfois pas. Vous pouvez tous vérifier $ x-> Query ("// * [@ @ ID = 'theid']") -> Longueur == 1 (pour PrixStinctAxSpan3047 C'est, mais regardez le 50 TABLY_01 S, sans émerveillement Domdocument PROTESTS :)


Ce que je cherche à atteindre, c'est si ce n'est pas unique, il trouve aussi les parents ID aussi et cela continue de le faire jusqu'à ce qu'il trouve un sélecteur unique .... Ce code XPATH est complexe! Pouvez-vous me donner un dernier morceau d'entretien :)


Eh bien, juste cette fois: P édité ma réponse. Je pense que cela peut être résolu sans une boucle dans une requête XPath, mais obtient un peu hors de portée, et est probablement mieux servi avec une question séparée avec les balises XPath , donc vous n'êtes pas obligé de compter sur Rusty Ol 'Me: P



9
votes
$html = file_get_html('http://www.google.com/');

$eles = $html->find('*');
foreach($eles as $e) {
    if(strpos($e->innertext, 'theString') !== false) {
        echo $e->id;
    }
}
http://simplehtmldom.sourceforge.net/manual.htm

2 commentaires

$ e--> id est le moyen DOM simple d'obtenir l'attribut ID. Peut-être essayer de changer $ eles = $ html-> trouver ('*'); to $ eles = $ html-> trouver ('p, div'); ou quelque chose .


N'est-ce pas getattribute ('id') ... Je ne peux pas le faire fonctionner indépendamment: s



3
votes

obtenu la réponse. L'exemple entier est un peu long mais ça marche. Je montre aussi la sortie.

Le HTML pour ce que nous allons regarder: p>

iUrl=test_text.htm
iText=love
Found love
18: text=We are looking for the following word love.
--- parent tag=li
--- parent id=love1
21: text=This paragraph which is in div second contains the word love.
--- parent tag=p
--- parent id=love2
25: text=link to love site
--- parent tag=a
--- parent id=love3


1 commentaires

Grand exemple. Savez-vous comment aller du texte, retour à un élément? Je veux rechercher par texte, puis trouver l'élément le plus proche. Il s'agit d'une ancienne mise en page de table sans classes ni identifiants.



5
votes

Imaginez simplement que n'importe quelle tag ait un attribut "plaintext" et utilisez des sélecteurs d'attributs standard.

donc, html: xxx

peut imaginer à l'esprit comme: < / p> xxx

et php pour résoudre votre tâche est juste: xxx

(N'oubliez pas que "plaintex" pour Tags est à droite avec un symbole d'espace; Ceci est un comportement par défaut de Simple HTML DOM, défini par constante par défaut_span_text )


1 commentaires

Jusqu'à présent, la meilleure réponse