preg_match

werwiewas29

Mitglied
hallo,, wenn ich in z.b. <h1....</h1> tag nach nem Keyword such.. und dann auch noch testen möchte ob es an 1.. Stelle ist.. müsste es eigentlich mit dem Code klappen:
PHP:
@preg_match_all("~<h1(>| [^>]*>)(.*)</h1>~isU",$content,$treffer);// \w = suche nach beliebigen Wort das enthalten ist. 
		
				#var_dump($treffer);
				
				$foundTrix = false;
				foreach($treffer[2] as $item){
					if(stristr($item, $keyword) !== false){ // strstr ( string $haystack , mixed $needle
					$foundTrix = true;
					break;
							}
				}

						if($foundTrix){
							print "1";
						}else{
							print "0";}
						  
					
					#preg_match("/[$keyword]/AbiUs",$item,$hier);
								
						
							
							@preg_match("/[\s]^($keyword).*/isU",$item,$hier);
							var_dump ($hier);
 
Tabulatoren scheinen Glücksache zu sein.
Hast du es schon mal mit dem DOMDocument versucht? Ist für sowas eigentlich einfacher
 
Und wo in deinem Code testest du ob der erste Treffer ist?

PS. Ein kleiner tipp. Entferne die @ vor den Befehlen. Das ist unsauber und hilft bei Problemlösungen absolut nicht. Es gibt nur ganz wenige ausnahmen wo es Sinn macht einen Fehler zu ignorieren.
 
das ganze geht von dem programm aus :
PHP:
function research6($url,$content,$keyword){

	$treffer = array();
	#print $content;
    #echo $_html; <TAG\b[^>]*>(.*?)</TAG>
	@preg_match_all("%<h1(.*)>(.*)</h1>%Uis",$content,$treffer);// \w = suche nach beliebigen Wort das enthalten ist. 
	#print $treffer[0]; //$matches[0] enthält dann den Text, der auf das komplette Suchmuster passt
	//test:
	#print $treffer[0]; // Inhalt Array
	
	#var_dump($treffer);
	

	
	
	
	
	$foundTrix = false;
	foreach($treffer[2] as $item){
		if(@stristr($item, $keyword) !== false){
        $foundTrix = true;
        break;
    }
}

			if($foundTrix){
				print "1";
			}else{
				print "0";
			}  


	
		} // function Ende
?>
 
Ist zwar keine Anwort auf meine Frage - aber egal. Mit DOMDocuments ist es einfacher und sauberer
PHP:
//Testdaten
$html = "
<html>
    <body>
        <h1 class='firstTitle'>abc</h1>
        <h1 name='foo'>def</h1>
        <h1 name='bar'>ghi</h1>
    </body>
</html>
";
$keyword = 'def';

//DomDocument erstellen
$dom = new DOMDocument();
$dom->loadHTML($html);
//Alle h1-Titels auselsen
$tags = $dom->getElementsByTagName("h1");
//erstes Vorkommen des Keyword suchen
$foundIndex = false;
foreach($tags as $index => $tag){
    if(stristr($tag->nodeValue, $keyword) !== false){
        $foundIndex = $index;
        break;
    }
}
//Auswerten ob und an welcher Stelle das Keyword gefunden wurde
if($foundIndex !== false){
    echo "gefunden mit Index {$index}";
}else{
    echo "nicht gefunden";
}
 
ich habe es mit
PHP:
$html = "http://www.news.at/";
 $keyword = "Lacher";
getestet..

leider nicht enthalten.. // stimmt aber nicht
 
Klar, der String "http://www.news.at/" enthält auch das Wort "Lacher" nicht.

eine der Zwei Varianten sollte gehen. Musst es halt auspropieren wie du den HTML-Code der Webseite kriesgs. (Habe das seit Jahren nicht mehr gebrauchst - du weisst selber besser wie man ein HTML-Code von einer fremden Seite ausliest)
PHP:
$html = file_get_contents("http://www.news.at/");
$dom->loadHTML($html);

//oder
$dom->loadHTMLFile("http://www.news.at/");
Zum Thema \iUs
i: getElementsByTagName() ist nicht Case-Sensitiv.
U: Bei dieser Funktion irelevant, da anderst aufgebaut und dabei ungierig automatish umgesetzt ist.
s: Zeilenumbrüche stören das DomDocument gar nicht.

Mit dem folgenden HTML geht mein Code von weiter oben immer noch. Darin sind alle drei (also iUs) im zweiten Titel (def) enthalten und er findet ihn problemlos als derjenige der das Keyword enthält.
HTML:
<html>
    <body>
        <h1 class='firstTitle'>abc</h1>
        <H1 
            name='foo'>
                def 
                <span>X</span>
        </h1>
        <h1 name='bar'>ghi</h1>
    </body>
</html>
Ergo, iUs braucht es in diesem Fall nicht.
 
Zurück