RegEx, wie in php lösen?

RegEx, wie in php lösen?

am 07.11.2006 17:46:00 von kenduron

Hallo zusammen,

vielleicht könnt ihr mir helfen, ich bin am verzweifeln.

Wie bekomme ich aus folgendem String:

----

Hallo mein Freund!

Suche hier [link]http://www.web.de[/link] und hier
[link]http://www.google.de[/link] nach aktuellen Nachrichten

---

die Werte "http://www.web.de" und "http://www.google.de" heraus.

Oder vielleicht einfacher:

Wie kann ich [link]web.de[/link] durch
ersetzen?

Weiß da jemand rat?

Schonmal Danke an alle,

Karsten

Re: RegEx, wie in php lösen?

am 07.11.2006 18:12:38 von Sven Drieling

Karsten Jung wrote:

Hallo,

> Wie bekomme ich aus folgendem String:
>=20
> ----
> Suche hier [link]http://www.web.de[/link] und hier
> [link]http://www.google.de[/link] nach aktuellen Nachrichten
>=20
> ---
>=20
> die Werte "http://www.web.de" und "http://www.google.de" heraus.


Ungetestet

preg_match('#\[link\](.*)\[/link\]#U'/, $text, $matches);
echo $matches[1];

Für alle preg_match_all()


Weitere Varianten unter

8. Reguläre Ausdrücke
http://www.php-faq.de/ch/ch-regexp.html

> Wie kann ich [link]web.de[/link] durch
> ersetzen?

preg_replace()


tschuess
[|8:)
--=20
PHP: preg_match() mit Treffern als assoziatives Array
http://www.sven-drieling.de/diary/2006/10/26/PHP_PregMatchNa mes.html

Re: RegEx, wie in php lösen?

am 07.11.2006 20:08:53 von Stefan Scholl

Rudi Menter wrote:
> Karsten Jung schrieb:
>> Wie kann ich [link]web.de[/link] durch
>> ersetzen?
>
> Das läuft darauf hinaus, den "Mittelteil" aus dem ersten der
> beiden obigen Ausdrücke zu extrahieren. Dazu gibt es natürlich
> sehr viele unterschiedliche Möglichkeiten, z.B. hier mal etwas
> fancy, "in Handarbeit" und ohne allzuviel auf Effizienz zu sehen.
>
> $s = " [ link ] web.de [ /link ]";
>
> // erst auf Syntax prüfen
> if (strstr($s, 'link') && strstr($s, '/link'))
> {
> $s = strstr($s, ']'); // $s := ]web.de[/link]

[...]

Das kommt bei Extreme Programming als Lösung für die erste oder
zweite Iteration eines Unit-Tests raus, löst aber das Problem
nicht wirklich.

Dein $s hat einen sehr einfachen Sonderfall. Karstens Beispiel
hatte aber mehr als nur einen Link im Text. Und man kann sich
auch Zeichenketten vorstellen, die ein "]" enthalten welches
nicht Teil von "[link]" ist.


Die Regex-Lösungen sind flexibler und decken einfacher alle
möglichen Fälle ab.

--
Web (en): http://www.no-spoon.de/ -*- Web (de): http://www.frell.de/

Re: RegEx, wie in php lösen?

am 07.11.2006 20:15:59 von Rudi Menter

Karsten Jung schrieb:

> Oder vielleicht einfacher:
>
> Wie kann ich [link]web.de[/link] durch
> ersetzen?

Das läuft darauf hinaus, den "Mittelteil" aus dem ersten der
beiden obigen Ausdrücke zu extrahieren. Dazu gibt es natürlich
sehr viele unterschiedliche Möglichkeiten, z.B. hier mal etwas
fancy, "in Handarbeit" und ohne allzuviel auf Effizienz zu sehen.

$s = " [ link ] web.de [ /link ]";

// erst mal etwas auf Syntax prüfen, dabei wird
// der "Zeiger" $s1 "vorgerückt"
if (($s1 = strstr($s, 'link')) && strstr($s1, '/link'))
{
$s = strstr($s, ']'); // $s := ]web.de[/link]
$s = strrev($s); // $s := ]knil/[ed.bew]
$s = strstr($s, '['); // $s := [ed.bew]
$s = strrev($s); // $s := ]web.de[
$s = strtr($s, '][', ' '); // $s := web.de
$s = trim($s);

$link = "";
echo $link . '
';
}

Und nochmals das gleiche, aber kompakter geschrieben:

$s = " [ link ] web.de [ /link ] ";

if (($s1 = strstr($s, 'link')) && strstr($s1, '/link')) {

$s = trim(strtr(strrev(strstr(strrev(strstr($s, ']')),'[')),'][',' '));

echo "" . '
';
}

fG
--

Re: RegEx, wie in php lösen?

am 07.11.2006 20:54:19 von Rudi Menter

Stefan Scholl schrieb:

> Dein $s hat einen sehr einfachen Sonderfall.

Ja.

> Karstens Beispiel hatte aber mehr als nur einen Link im Text.

Natürlich, da hast du ganz recht. Hier werden bereits passende
Paare erwartet!

> Und man kann sich auch Zeichenketten vorstellen, die ein "]"
> enthalten welches nicht Teil von "[link]" ist.

Das wäre einfach, erst ab '[ link ]' wird es unübersichtlich...

Aber na klar, es war auch nur eine exemplarische Spielerei,
allein durch Anwendung von strrev, so daß man nur die erste
und letzte Klammer im String erwischt! Deshalb wird man bei
meiner Lösung *natürlich* erst mal korrespondierende und
zusammenstehende(!) Paare von [ Ausdruck ] ... [ /Ausdruck ]
parsen.

Aber die Sache macht schon auch Sinn, sicher nicht unbedingt
überall in PHP, aber nimm einen Browser oder Html-Interpreter,
der riesige Zahlen von beliebig verschachtelten Paaren von
< Ausdruck > ... < /Ausdruck > *schnell* verarbeiten muß.

Sowas macht man nicht mit Regex (oder Lex and Yacc) aber es
ist andererseits auch Unsinn, sowas überhaupt ohne Pointer
zu machen, naja, obwohl, immerhin kennt PHP Referenzen...

fG
--