Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

preg_match_all & look-ahead

0 views
Skip to first unread message

Philipp Ghirardini

unread,
Feb 8, 2011, 8:45:39 AM2/8/11
to
Hallo,

Ich bin mir nicht sicher ob das die richtige Newsgroup ist, ich probiere
es dennoch.

Ich habe folgendes Problem:
Ich muss in einem bestimmten String verschiedene Zeichen durch Makros
ersetzen. Makros sehen so aus: $<name>$.
Leider muss auch das einfache Dollarzeichen durch ein Makro ($DOLLAR$)
ersetzt werden.

z.B.:

Ersetze ($) aber nicht $VARIABLE:a$ und $CONST$

soll zu:

Ersetze ($DOLLAR$) aber nicht $VARIABLE:a$ und $CONST$

werden.

Im Moment verwende ich folgendes Pattern:

/\$(?:(?!(VARIABLE|CONST.*\$)))/U

und erhalte:

Ersetze ($DOLLAR$) aber nicht $VARIABLE:a$DOLLAR$ und $CONST$DOLLAR$


Es sei erw�hnt, dass die meisten Makros Variablen halten k�nnen. In dem
Beispiel w�rde $VARIABLE$ den Parameter 'a' enthalten.

Das Problem w�re leicht gel�st, wenn es eine M�glichkeit g�be, dass nach
einem erfolgreichen look-ahead nach dem Treffer fortgesetzt wird.

Da sie ja auch Zero-Width Assertions genannt werden ist das leider nicht
der Fall.

Bin f�r alle Ratschl�ge dankbar,

mfg Philipp

Ulf K@dner

unread,
Feb 8, 2011, 5:04:49 PM2/8/11
to
Am 08.02.2011 14:45, schrieb Philipp Ghirardini:

> Ich habe folgendes Problem:
> Ich muss in einem bestimmten String verschiedene Zeichen durch Makros
> ersetzen. Makros sehen so aus: $<name>$.
> Leider muss auch das einfache Dollarzeichen durch ein Makro ($DOLLAR$)
> ersetzt werden.
>
> z.B.:
>
> Ersetze ($) aber nicht $VARIABLE:a$ und $CONST$
>
> soll zu:
>
> Ersetze ($DOLLAR$) aber nicht $VARIABLE:a$ und $CONST$
>
> werden.
>
> Im Moment verwende ich folgendes Pattern:
>
> /\$(?:(?!(VARIABLE|CONST.*\$)))/U
>
> und erhalte:
>
> Ersetze ($DOLLAR$) aber nicht $VARIABLE:a$DOLLAR$ und $CONST$DOLLAR$

Manchmal ist es logisch einfacher alles auf 2 oder mehr Aktionen
aufzuteilen.

Ich würde hier nicht so strikt versuchen alles mit einem Regex zu
erschlagen da das nicht ohne weiteres möglich ist.

Kleine Denkanregung:

$str = 'Ersetze ($) aber nicht $VARIABLE:a$ und $CONST$ a$';
$GLOBALS['tags'] = array();
$str = \preg_replace_callback(
'~\$[A-Za-z0-9_][A-Za-z0-9_:]*\$~', function ( $matches )
{
$tmp = '#{' . \count($GLOBALS['tags']) . '}';
$GLOBALS['tags'][$tmp] = $matches[0];
return $tmp;
}, $str );
echo \str_replace(
\array_keys($GLOBALS['tags']),
\array_values($GLOBALS['tags']),
\str_replace('$', '$DOLLAR$', $str));

MfG, Ulf

0 new messages