2016-05-05 6 views
0

Der Code muss überprüfen, ob eine Zeichenkette zwischen den Tags gefunden wird. Aber wie Sie sehen können, die Span-Tag mit vielen anderen Attributen und anderen CSS-Klassen gebaut, die sich ändern, ist es ziemlich unvorhersehbar.RegEx - Überprüfen Sie, ob eine Zeichenfolge innerhalb SPAN-Tag einer bestimmten CSS-Klasse ist da?

$body = '<p>Lorem ipsum, lorem ipsum. Lorem ipsum, lorem ipsum. Lorem ipsum, lorem ipsum. Lorem ipsum, lorem ipsum. Lorem ipsum, lorem ipsum.</p><p><span id="subject-47" class="enco-subject enco-subject-post-1" data-id="47">Semencic credits his early familiarity with the breed to his own travels to South Africa<span class="enco-comment-count">4</span></span> , but especially to his frequent correspondence with the head of the first South African Boerboel club, one Mr. Kobus Rust. <strong>The&nbsp;Boerboel Breeders Association was established in 1983</strong> in the Senekal district of the Free State with the sole objective of ennobling and promoting the Boerboel as a unique South African dog breed.</p>'; 

$body2 = 'We all love South Africa because of its <span class="enco-highlight">beautiful scenery</span>. It is not the cheapest country but blah blah blah.'; 

$string_to_check = 'South Africa'; 

So, hier ist das, was zurückgegeben werden soll:

  • Körper = existiert die Zeichenfolge innerhalb span.enco-Subjekt-Tag (aber es ist ein komplizierter Tag ..)

  • body2 = die Zeichenkette existiert nicht in span.enco-subject

Antwort

0

Sie können einen HTML-Parser verwenden, um das gesuchte Tag zu finden. Auf diese Weise können Sie Ihren HTML-Code objektorientiert mit umfangreichen Methoden zum Auffinden der gewünschten Elemente abfragen. PHP kommt mit dieser Funktionalität aus der Box:

HTML Parsing with PHP

Official PHP DOM Manual

0

Sie können versuchen, die folgende regex:

$string_to_check = 'South Africa'; 
$regex = '/<span (.*)class="(.*)enco-subject(.*)">(.*)(' . $string_to_check . ')(.*)<\/span>/'; 
preg_match($regex, $body, $matches); 

Das Ergebnis var_dump($matches):

array(7) { 
    [0]=> 
     string(212) "Semencic credits his early familiarity with the breed to his own travels to South Africa4" 
    [1]=> 
     string(16) "id="subject-47" " 
    [2]=> 
     string(13) "enco-subject " 
    [3]=> 
     string(20) "-post-1" data-id="47" 
    [4]=> 
     string(76) "Semencic credits his early familiarity with the breed to his own travels to " 
    [5]=> 
     string(12) "South Africa" 
    [6]=> 
     string(41) "4" 
} 
+0

Es funktioniert nicht, es gibt mir falsche Treffer: Array ( [0] => Array ( [0] => Semenčić schreibt seine frühe Vertrautheit mit der Rasse zu seinen eigenen Reisen nach South Afrika4 [1 =]> 139 ) [1] => Array ( [0] => id = "subject-47" [1] => 145 ) [2] => Array ( [ 0] => enco-subject [1] => 168 ) [3] => Array ( [0] => -Post-1" -Daten-id = " 47 [1] => 193 ) ....... ) – Lazhar

+0

Es Du gehst, ich habe das Preg-Match aktualisiert. Grundsätzlich ist der string_to_check immer auf Index 5, der über '$ matches [5]' zugänglich ist –

0

Die unterste Antwort lautet: Sie can't do this mit jedem Anschein von Zuverlässigkeit mit Regex, vor allem wegen der verschachtelten Natur von HTML. Überlegen Sie:

<span class"special"><span class="otherclass">Some text</span>South Africa</span> 

Sie möchten, dass "Südafrika" übereinstimmen, richtig? Aber wie weiß der reguläre Ausdruck, dass der erste </span> nicht den äußeren Bereich mit class="special" beendet? Es ist nicht möglich, und es gibt keine Möglichkeit für einen Regex, verschachtelte ausgeglichene Konstrukte ohne irgendeine Art von Tracking-Mechanismus zu konsumieren. (.NET hat die balancing groups Features, das dies tut)

0

ich in Angriff genommen habe dies anders und gebaut, dass die Funktion:

public function in_subject($subject, $content) { 

    $result = false; 

    $regex = '/enco-subject(.*?)<\/span>/'; 

    preg_match_all($regex, $content, $matches); 

    foreach ($matches as $match) { 

     if(!empty($match)) { 

      if(strpos($match[0], $subject) > -1) { 
       $result = true; 
      } 

     } 

    } 

    return $result; 
} 

Und es funktioniert!

Verwandte Themen