Autor Zpráva
Ipekarp
Profil *
Dobrý den,

chtěl bych požádat o radu s regulárním výrazem, pomocí:

$file = file_get_contents('http://localhost/import/hwinfo/', true);


si načtu do proměnné výpis jiného php scriptu a chtěl bych v něm pomocí:

preg_match("/<th>Kernel</th>(.*)</tr><tr>/", $file, $matches);
print_r($matches);


nalézt a vypsat řetězec který se nachází ve výpisu mezi značkami: <th>Kernel</th> a </tr><tr>.

Vidí zde někdo chybu?

Moc děkuji!

Moderátor Joker: Titulek „Regulární výraz“ byl příliš obecný.
Tori
Profil
Ipekarp:
Proč nastavujete 2.parametr u file_get_contents, když čtete z URL? Není to tím?

Aha, zkusila jsem to a 2.param. nemá vliv. Nemůže být ve zdrojáku zalomení řádku nebo pár mezer mezi tagy? Pokud hledaný text obsahuje znak \n, musíte použít v reguláru modifikátor s.
Ipekarp
Profil *
Dobrý den,

děkuji za odpověď, mezi tagy by ale žádné zalomení být nemělo. :( Mohu se zeptat kam přesně vložit modifikátor s? S reguláry nejsem moc kamarád a tohle je napůl vygooglené, napůl dobastlené. :)

Ještě jednou děkuji.
Ipekarp
Profil *
Oprava, teď jsem se na to díval, odřádkování tam budou...
Tori
Profil
Pokud se může vyskytnout odřádkování i mezi tagy, tak v tom místě použijte třeba
\s*
Modifikátor až na konec, za lomítko.
DarkMeni
Profil
Možná by se tam hodil i modifikátor i (aby nerozlišoval velikost písmen). Modifikátory se dávají za lomítko nebo znak který označí začátek a konec výrazu, takže v tvém případě je ten znak lomítko, takže: preg_match("/výraz/modifikatory",...)
preg_match("/<th>Kernel</th>(.*)</tr><tr>/is", $file, $matches);
Ipekarp
Profil *
Opět děkuji, ale bohužel nejde. Výpis části scriptu o kterou se jedná:
<tr>
					<th>Kernel</th>
					<td>6.1.7600</td>
				</tr>

A regulár jsem upravil následujícně:
 preg_match("/<th>Kernel</th>\s*(.*)\s*</tr><tr>/s", $file, $matches);
Tori
Profil
Jsem si předtím nevšimla: Pokud uvnitř reguláru chcete použít stejný znak, jaký používáte jako oddělovač (u vás lomítko), je potřeba ho escapovat (anebo použít jako oddělovač takový znak, který se v reguláru nevyskytuje). Takže jedna z následujících variant:
preg_match("/<th>Kernel<\/th>\s*(.*)\s*<\/tr>/is", $file, $matches);
preg_match("~<th>Kernel</th>\s*(.*)\s*</tr>~is", $file, $matches);
DarkMeni
Profil
S preg_match si moc nerozumim ale napadlo mě řešení v preg_replace
$cely_radek = preg_replace("=<tr>(<th>Kernel</th><td>.*?</td>)</tr>=is","<tr>$1</tr>",$file);
$hodnota_v_td = preg_replace("=<tr>(<th>Kernel</th><td>(.*?)</td>)</tr>=is","$2",$file);
//Teď záleží na tom jestli chceš jen tu hodnotu nebo celý řádek (výsledek celého řádku je v html tázích který když nevložíš do tabulky buď zmizí nebo zničí zbytek stránky

EDIT: Tak než sem to dotestoval a dopsal už tu odpověď byla tak se omlouvám za "nechtěný" spam
Ipekarp
Profil *
D9ky, je to rozhodně bližší výsledku, bohužel to ovšem bere od začátku řetězce v reguláru a neukončuje se to, bere to text i dále, toto je výsledek který mi vypíše print_r($matches); :

(
    [0] => <th>Kernel</th>
					<td>6.1.7600</td>
				</tr>
				
				<tr>
					<th>Accessed IP</th>
DarkMeni
Profil
Asi je "hladovej" zkus dát za "(.*)" ještě otazník, aby to vypadalo takto: "(.*?)"
preg_match("~<th>Kernel</th>(.*?)</tr>~is", $file, $matches);
//nebo
preg_match("/<th>Kernel<\/th>(.*?)<\/tr>/is", $file, $matches);
Ipekarp
Profil *
Perfektní, toto je už zpracovatelné, uzavřel bych to tedy jen dotazem:

Array ( [0] => Kernel 6.1.7600 [1] => 6.1.7600 ) 


Proč to vrací jednou i s Kernelem a po druhé bez do dvou hodnot pole?



Moc děkuji za Vaši pomoc!
DarkMeni
Profil
Možná kvůli závorce, zkus to bez závorky:
preg_match("~<th>Kernel</th>.*?</tr>~is", $file, $matches);
//nebo
preg_match("/<th>Kernel<\/th>.*?<\/tr>/is", $file, $matches);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0