2017-01-05 7 views
-1

Ich habe eine ZeichenfolgeExtrahieren von Text zwischen dem ersten <a> Tag

$str = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor <a href="http://example2.com">Do not want this text</a> incididunt ut labore et <a href="http://example.com">Want this text</a> dolore magna aliqua. Ut enim ad  minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat. Duis aute irure dolor in <a href="http://example.com">Do not want this text</a> reprehenderit in voluptate velit esse 
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; 

Wie kann ich den Text zwischen der ersten Instanz eines Tags extrahieren, die zu http://example.com verbindet? Ich möchte nicht den Text, der auf http://example2.com oder den Text in der zweiten Verbindung verweist, die auf http://example.com verweist.

Ich möchte 'Wollen Sie diesen Text' zurückgeben. Irgendeine Idee, wie man das macht?

Danke!

+2

Mögliches Duplikat [Regex PHP, Match alle Verbindungen mit einem bestimmten Text] (http://stackoverflow.com/questions/1661179/regex-php-match-all-links-with-specific-text) – yivi

Antwort

-1

Verwenden preg_match()

Beispiel:

$string = '<a href="http://example2.com">Do not want this text</a> incididunt ut labore et <a href="http://example.com">Want this text</a> '; 

if (preg_match('/<\s*a[^<>]*>([^<>]+)</a>/i', $string, $matches)) { 
     var_dump($matches); 
} 
+3

[Sie sollten Regex nicht verwenden, um HTML zu analysieren] (http://stackoverflow.com/questi onions/590747/using-regular-expressions-to-parse-html-why-not) –

+0

Und warum ist das? – malutki5200

+0

@ malutki5200 für den Fall, dass Sie [den Link] nicht bemerkt haben (http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not) * Herr Martin * in der verwendet Kommentar, Sie sollten die Antworten (und Kommentare) zu [der Frage] lesen (http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not) –

0

Sie können dies mit einem regex, zum Beispiel:

\<a href=\"http:\/\/example.com\".*\>(.*?)\<\/a\> 

Code-Snippet:

$str = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor <a href="http://example2.com">Do not want this text</a> incididunt ut labore et <a href="http://example.com">Want this text</a> dolore magna aliqua. Ut enim ad  minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat. Duis aute irure dolor in <a href="http://example.com">Do not want this text</a> reprehenderit in voluptate velit esse 
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; 

$regex = '/\<a href=\"http:\/\/example.com\".*\>(.*?)\<\/a\>/g'; 
preg_match($regex, $str, $matches); 

In $ matches du wirst Finde die gewünschte Ausgabe.

+1

[Sie sollten nicht ' t verwenden Regex, um HTML zu analysieren] (http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not) –

+0

@mistermartin viel schneller und weniger Bugy als DomDocument ... As Solange Sie nicht eine ganze Datei analysieren müssen, ist Regex besser. – Blaatpraat

2

Sie können Ihr Ziel wahrscheinlich mit DOMDocument erreichen - in Verbindung mit DOMXPath für kompliziertere Anforderungen.

$dom=new DOMDocument; 
$dom->loadHTML($str); 

$col=$dom->getElementsByTagName('a'); 
if(!empty($col)){ 
    foreach($col as $node)echo $node->nodeValue; 
} 
1

Sie müssen DomDocument verwenden. DomDocument können Sie PHP verwenden, um mit einer HTML-Seite über das Document Object Model zu interagieren.

$dom = new DomDocument; 
$dom->loadHTML(file_get_contents($url)); 
$dom->preserveWhiteSpace = false; //remove unnecessary whitespace 
$links = $dom->getElementsByTagName('a'); 

An dieser Stelle haben Sie eine Reihe von Objekten. Jedes Objekt ist im Wesentlichen ein ElementNode mit dem Tag a.

Angenommen, Sie den Text des ersten Link abrufen möchten, würden Sie dann tun: $text = $links[0]->nodeValue;

Wenn Sie jedoch stattdessen den Text möchten, der über den Link „http://example.com“ übereinstimmt, dann könnten Sie tun, :

foreach ($links as $link) 
{ 
    if($link->attributes->href == "http://example.com") { 
    $text = $link->nodeValue; 
} 
Verwandte Themen