ubuntuusers.de

[PHP] Einen Array nach Regulären Ausdrücken durchsuchen

Status: Gelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

Nookie

Avatar von Nookie

Anmeldungsdatum:
16. Mai 2010

Beiträge: 104

Wohnort: Ostschweiz

Hallo, ich versuche einen Array mit ca 4000 - 5000 elementen nach einem zu durchsuchen und alle elemente die NICHT einem reg-ausdruck entsprechen zu löschen.

Den array würde ich so durchsuchen:

1
2
3
4
5
6
7
8

for($i = 0; $i <= sizeof($string); $i++)
{
    if(!regulärer_ausdruck)
    {
        unset($string[$i]);
    }
}

nur habe ich leider von reg-ausdrücken keine ahung... wie müsste der aussehen wenn ich alles im array behalten möchte das mit <a href="/post/show/ beginnt?

mfg

Kuehly

Anmeldungsdatum:
15. Oktober 2006

Beiträge: 282

Hi. Der Ausdruck könnte etwa so aussehen:

1
2
3
if(preg_match('/^<a href="\/post\/show\//', $string[$i]) == 0) {
    unset($string[$i]);
}

Löschen, wenn es keinen Treffer mit dem Ausdruck gibt. ⇒ preg_match

Gruß, Jan

Nookie

(Themenstarter)
Avatar von Nookie

Anmeldungsdatum:
16. Mai 2010

Beiträge: 104

Wohnort: Ostschweiz

mhh, klappt noch nicht so wie ich will... hier das gesammte script?

da sollte doch eigentlich nichts mehr auser alles was mit <a href=/post/show/ beginnt durchkommen?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

<h1> Eingabe </h1>
<form method="POST" action="">
<textarea name="input" rows="20" cols="100">

</textarea><br />
<input type="submit" value="Filtern">
</form>

<h1> Ausgabe: </h1>

<?PHP

	$string = $_POST["input"];

	$string = explode(" ", $string);
	
	
	for($i = 0; $i <= sizeof($string); $i++)
	{
		if(preg_match('/^<a href="\/post\/show\//', $string[$i]) == 0) 
		{
		    unset($string[$i]);
		}
	}

	sort($string);
	for($i = 0; $i <= sizeof($string); $i++)
	{
		echo("$string[$i] <br />");
	}

	var_dump($string);


?>

Kuehly

Anmeldungsdatum:
15. Oktober 2006

Beiträge: 282

Ich denke mal, das liegt aber nicht an dem Filter. Du splittest ja mit einem Leerzeichen als Trenner. In dem Link, den du haben willst ist aber ein Leerzeichen drin. Also wird aus '<a href="...">' ein Array mit den Elementen '<a' und 'href="...">'. Wenn du pro Zeile einen Link hast, könntest du mal versuchen mit einem Zeilenumbruch zu splitten, also explode("\n", $string).

Außerdem ist mir noch etwas aufgefallen. Deine erste for-schleife geht nicht über alle Elemente drüber. Das scheint daran zu liegen, dass, sobald ein Element gelöscht wird, das Array logischerweise ein Element kleiner wird. Wenn das Array am Anfang 4 Elemente hat und zwei zwischendrin gelöscht werden, läuft die Schleife scheinbar nur noch bis Index 2. Um das zu Umgehen, kann man das Array rückwärts durchlaufen:

1
2
3
4
5
6
7
for($i = sizeof($string) - 1; $i >= 0; $i--)
{
    if(preg_match('/^<a href="\/post\/show\//', $string[$i]) == 0) 
    {
        unset($string[$i]);
    }
}

Beachte $i = sizeof($string) - 1. Der Fehler taucht auch noch in der zweiten Schleife auf. sizeof gibt die Anzahl der Elemente zurück. Der Index fängt aber bei 0 an. Wenn es also 4 Elemente gibt, ist sizeof($string) = 4, es gibt aber nur die Indizes 0, 1, 2, und 3. Es muss also $i < sizeof($string) heißen, nicht ⇐.

Gruß, Jan

Nookie

(Themenstarter)
Avatar von Nookie

Anmeldungsdatum:
16. Mai 2010

Beiträge: 104

Wohnort: Ostschweiz

ah, sehr schön, dank deiner Hilfe funktioniert nun alles einigermaßen so wie es sollte =) du hast mir sehr geholfen.

Aber da ich das Forum nicht mit noch nem weiteren Thema vollspamme frag ich gleich auch noch hier:

Ist es möglich in reg-ausdrücken so etwas wie ein logisches OR zu verwenden?

wenn ich zB ein match auf alle urls haben möchten die mit http://abc.com/ und http://lol.de/ haben will?

ist verständlich wonach ich suche?

wenn ich zb abc.com matchen will mache ich das so ...

preg_match('/^http\:\/\/abc\.com\//', $string_sub[$i]) == 0)

aber ich will eben einen match auf abc.com oder lol.de

mfg

Kuehly

Anmeldungsdatum:
15. Oktober 2006

Beiträge: 282

Hm. Ich kenne mich mit Regular Expressions auch nicht so super aus. Was auf jeden Fall auch geht wäre ja sowas:

1
2
if(preg_match('/^http\:\/\/abc\.com\//', $string[$i]) == 0 ||
   preg_match('/^http\:\/\/lol\.de\//', $string[$i]) == 0)

Habe grade mal kurz gegooglet. Man kann mit der Pipe | auf verschiedene Strings matchen. Also müsste das gehen:

1
if(preg_match('/^http\:\/\/(abc\.com|lol\.de)\//', $string[$i]) == 0)

Das geht jetzt davon aus, dass http:// immer vorne steht. Der Teil in den Klammern enthält also die verschiedenen Strings.

– Jan

Antworten |