webForumDet fria alternativet

Sökning i sträng

26 svar · 758 visningar · startad av Web-Tor

Web-TorMedlem sedan nov. 200013 890 inlägg
#1

Den här koden kommer att skiva ut "foo".
Hur gör jag för att den istället ska skriva ut "6351529770" när den får träff på "foo"?
Jag kan alltså inte ändra på words-arrayen för att få den att söka efter "6351529770" direkt.

<?
$str='dSI(0,0,6351529770,"foo and some more stuff",0,1)';
$words=array('foo','bar');
foreach ($words as $word){
	if (preg_match('/'.$word.'/is',$str,$match)){
		echo $match[0];
	}
}
?>
MatteMedlem sedan aug. 20002 975 inlägg
#2

Är det alltid en nummerserie och ett kommatecken framför, och är strängen alltid omgiven av citationstecken borde det gå att ta med det i ditt regexp-mönster, och därmed hämta ur den första parentesen.

Web-TorMedlem sedan nov. 200013 890 inlägg
#3

Jag skulle naturligtvis ha varit lite tydligare med reglerna för uttrycket.
Parametern "6351529770" ligger alltid precis före parametern som kan innehålla "foo".
Parametern "6351529770" är alltid en nummerserie.
Antalet parametrar före "6351529770" och efter "foo" kan variera.

Jag suger på reguljära uttryck så ni får gärna hjälpa till. :)

MatteMedlem sedan aug. 20002 975 inlägg
#4

Är parametern som innehåller 'foo' alltid omgiven av citationstecken ?
Kan det finnas andra parametrar innan som är omgivna av citationstecken ?
Kan det finnas mellanslag efter kommattecknet ?

[EDIT]
Vad jag tänker på är alltså något i stil med

foreach ($words as $word){
    if (preg_match('/(\d+),\s*".*?' . preg_quote($word) . '.*?"/is', $str, $match)){
        echo $match[1];
    }
}
Web-TorMedlem sedan nov. 200013 890 inlägg
#5

Är parametern som innehåller 'foo' alltid omgiven av citationstecken?

Ja.

Kan det finnas andra parametrar innan som är omgivna av citationstecken?

Ja.

Kan det finnas mellanslag efter kommattecknet?

Nej.

Din kod funkar nästan. Det är alltid flera rader som jag läser in. Raderna ser allihop ut på samma sätt som jag visar ovan fast innehåller så klart olika information. Om "foo" hittas så plockar din kod plockar ut den nummerserie som finns på raden ett istället för nummerserien som ligger på samma rad som "foo".
Hänger du med?

MatteMedlem sedan aug. 20002 975 inlägg
#6

Varje sådan "uttryck" ligger alltså på en rad, och du kan inte ha en radbrytning i den ?

Att det kunde finna flera parametrar med citationstecken om sig, var det på samma rad, eller menade du att de fanns på andra rader ?

Testa med:

foreach ($words as $word){
    if (preg_match_all('/(\d+),"[^"]*' . preg_quote($word) . '[^"]*"/ism', $str, $match)){
        echo $match[1][0];
    }
}
Web-TorMedlem sedan nov. 200013 890 inlägg
#7

Varje sådan "uttryck" ligger alltså på en rad, och du kan inte ha en radbrytning i den?

Stämmer.

Att det kunde finna flera parametrar med citationstecken om sig, var det på samma rad, eller menade du att de fanns på andra rader?

Det finnas både på samma rad och på andra rader.

Jag har testat din kod och det ser ut att funka funkis!
Stort tack! :f

MatteMedlem sedan aug. 20002 975 inlägg
#8

Är tveksam till att det funkar överallt.

Vi letar i varje rad efter ett uttryck
0000000000,"xxxxxxxxxxxxx" där 0 är siffror och x ett tecken som inte är citationstecken.

Finns det flera på varje rad kommer endast den första att visas.
Kan det finnas flera på samma rad så är det inget problem då fixar vi till koden så den hittar alla, men är det endast t.ex. den andra du söker så behövs det mer information för att kunna ringa in det.

Web-TorMedlem sedan nov. 200013 890 inlägg
#9

Matte skrev:

Finns det flera på varje rad kommer endast den första att visas.

Nja..jo... det finns ett litet fel.
Finns "foo" på flera rader så tar den bara med den första träffen. Fast det var kanske så du menade?

MatteMedlem sedan aug. 20002 975 inlägg
#10

Det är inte regexpen det är fel på utan utskriften:

$str='
dSI(0,0,1351529770,"foo and some more stuff",0,1)
dSI(0,0,2351529770,"foo and some more stuff",0,1)
dSI(0,0,3351529770,"bar and some more stuff",0,1)
dSI(0,0,4351529770,"bar and some more stuff",0,1)
';

$words=array('foo','bar');

$hits = array();

foreach ($words as $word){
    if (preg_match_all('/(\d+),"[^"]*' . preg_quote($word) . '[^"]*"/ism', $str, $match)){
        $hits = array_merge($hits, $match[1]);
    }
}

for ($i=0; $i<count($hits); $i++) {
   echo $hits[$i]."<br>";
}

Skulle du ha flera foo som ligger i en sträng, med ett tal framför, på samma rad, så kommer bägge att hittas. Det var det som eventuellt var problemet.

Web-TorMedlem sedan nov. 200013 890 inlägg
#11

Jag läser in texten med file_get_contents() så strängen ser ju ut på det sätt som du visar.
Din kod ser ut att funka fint.
Tack igen. :)

Web-TorMedlem sedan nov. 200013 890 inlägg
#12

Nu skulle jag behöva lite hjälp med den här funktionen.

Läser jag in en sida som ligger lokalt så funkar det men inte om den ligger någon annan stans.
Kör jag med sökväg 1 så skriver den ut "ingen träff" men om jag kopierar koden från sidan (som är en fake-sökning på eBay) och sparar texten lokalt så får jag två träffar. Någon som kan förklara varför?

<?
function find_numbers($str) {
	$words=array('presley');
	global $svar;

	foreach ($words as $word){
		if (preg_match_all('/(\d+),"[^"]*' . preg_quote($word) . '[^"]*"/ism',$str,$match)){
			$svar=array_merge($svar, $match[1]);
		}
	}

	if ($svar)
		for ($i=0; $i<count($svar); $i++)
			 echo $svar[$i]."<br>";
	else
		echo "Ingen träff";
}

// Sökväg 1
$page='http://search.ebay.com/elvis-sandwich_W0QQcatrefZC6QQcatrefZC6QQcoactionZcompareQQcoentrypageZsearchQQcopagenumZ1QQfromZR10QQsojsZ1QQsosortpropertyZ1QQsospellrecommendationZ1QQsotrtypeZ1QQsotrvalueZ1';

// Sökväg 2
#$page='testfil.html';

$page=file_get_contents($page);
find_numbers($page);
?>
MatteMedlem sedan aug. 20002 975 inlägg
#13

Jag testade länken, kopierade hem HTML-koden lokalt, och testade ditt skript.
Jag fick lokalt "Ingen träff", och det skulle jag också få, eftersom det ingenstans på sidan finns något som uppfyller kriteriet:
En eller fler siffror följt av ett kommatecken,
följt av ett citationstecken,
följt av noll eller fler av tecken som inte är citationstecken,
följt av sökordet,
följt av noll eller fler av tecken som inte är citationstecken,
följt av citationstecken
.

Så hur du kunde få träff lokalt förstår jag inte.

Web-TorMedlem sedan nov. 200013 890 inlägg
#14

Jag ser nu att det av någon anledning smyger sig in två mellanslag i länken ($page).
Dom finns inte när jag redigerar inlägget så man får ta bort dom
för hand när man kopierar koden.

Det här en av raderna som jag får träff på lokalt:

dSI(1,1,0,0,0,0,1,0,0,1,0,0,0,0,3862965204,"Elvis Presley &quot;Fried Banana Sandwich&quot; Pot Holders","","/ws/eBayISAPI.dll?ViewItem&category=433&item=3862965204&rd=1&ssPageName=WDVW",'','$4.00','','',0,"","4d&#160;12h&#160;47m",{},"0,0,0,0,0,0,0,0,0,0,0,0",{},{},{},0,{},"",0,0,0,"",0,"",0,0,0,0);
MatteMedlem sedan aug. 20002 975 inlägg
#15

Tittar man på innehållet i HTML-koden så är den olika om man hämtar den direkt från webbläsaren, mot vad man får om man hämtar sidan via webbservern.

Sidan verkar skicka olika kod beroende på vem/vad som anropar, men vad som styr vet jag inte. Jag testade att sätta User-Agent när jag anropade sidan med fsockopen, men det verkade inte göra någon skillnad.

Web-TorMedlem sedan nov. 200013 890 inlägg
#16

Tittar man på innehållet i HTML-koden så är den olika om man hämtar den direkt från webbläsaren, mot vad man får om man hämtar sidan via webbservern.

:q Ja förstår inte skillnaden? Den kod som visas direkt från webbplatsen är väl samma som man ser om man väljer "Visa källa"?

MatteMedlem sedan aug. 20002 975 inlägg
#17

Web-Tor skrev:

:q Ja förstår inte skillnaden? Den kod som visas direkt från webbplatsen är väl samma som man ser om man väljer "Visa källa"?

Den HTML-kod du får när du hämtar sidan via skriptet är inte samma som du får när du hämtar sidan i webbläsaren.

På något sätt känner sidan av vad det är som hämtar, och presenterar olika kod. Om detta är avhängigt User-Agent, Cookie eller något annat har jag ingen aning om.

Web-TorMedlem sedan nov. 200013 890 inlägg
#18

Aha! Nu förstår jag vad du menar. Som jag ser det kan man lösa det på tre sätt:
1. Fixar med file_get_contents() så att den hämtar annan information
2. Använder en annan funktion än file_get_contents() för att läsa in informationen från sidan.
3. Skriver om det reguljära uttrycket så att det passar till informationen som file_get_contents() hämtar.

Stämmer det? Tror du att det går att lösa genom punkt 1 eller 2?

MatteMedlem sedan aug. 20002 975 inlägg
#19

Jag testade alternativ 2 genom att istället använda fsockopen och sätta header User-Agent, men resultatet blev detsama som med file_get_contents, så jag tror du får använda dig av alternativ 3.

Web-TorMedlem sedan nov. 200013 890 inlägg
#20

Matte skrev:

...så jag tror du får använda dig av alternativ 3.

Du har nog rätt.

Det bästa hade nog varit om jag lyckades få ut hela sökvägen (värdet av href-attributet) vid en sökning på "Word".

<a href="http://www.page.com?foo=bar">Word</a>

Hur kan ett sådant reguljärt uttryck se ut?

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)