REGEXP - Anführungszeichen kodieren
Dieter
- programmiertechnik
Hallo Forumer, REGEXPerten
ich bräuchte für folgendes Problem Eure Hilfe, Anregungen oder Schubser auf den richtigen Weg.
Ich möchte in einem String Anführungszeichen ersetzen. Ok, das ist einfach, allerdings stehen da auch HTML a- und img tags drin die ebenfalls "s haben die natürlich nicht ersetzt werden sollen.
Beispiel:
$test='Hallo das ist ein "Test" um zu testen und ein Link nach <a href="www.dummy.de">"irgendwo"</a> <img src="test.jpg" width="100">';
soll also ergeben:
$neu='Hallo das ist ein "Test" um zu testen und ein Link nach <a href="www.dummy.de">"irgendwo"</a> <img src="test.jpg" width="100">';
Mit anderen Worten nur die "s welche nicht innerhalb von tags sind sollen ersetzt werden.
Letztendlich sollen die normalen "s automatisch durch fränzösische Anführungen (öffnende und schliessende ersetzt werden) aber das ist erst der zweite Schritt, da ich im Moment schon beim Ersten Schwierigkeiten habe.
Viele Grüße
Euer Dieter
Hi,
Mit anderen Worten nur die "s welche nicht innerhalb von tags sind sollen ersetzt werden.
dazu reichen RegExp nicht aus. Du musst Dir etwas komplexeres suchen.
Cheatah
Hallo Forumer, REGEXPerten
so jetzt habe ich doch noch eine halbwegs akzeptable (PHP-) Lösung gefunden. War gar nicht so schlimm wie ich zunächst dachte.
Allerdings klappt das Beispiel nicht für den Teil am Ende.
Vielleicht kann jemand von Euch helfen?
Die "Tüttelchen" um Ende werde nicht ersetzt, bzw. das Pattern passt so nicht auf den Stringteil nach dem letzten tag.
Viele Grüße
Euer Dieter
<?php
$test='"Hallo" das ist ein "Test" um zu testen, und natürlich ein Link nach <a href="http://www.dummy.de">"irgendwo"</a> <img src="test.jpg" width="100"> und am "Ende"';
function french_quote($v)
{
$pattern=array('/\b"/','/"\b/');
$replacement=array('«','»');
$tmp= preg_replace($pattern,$replacement,$v);
return $tmp;
}
function my_quote($v)
{
return $v[1].french_quote($v[2]).$v[3];
}
$neu =preg_replace_callback('/(<.*>){0,}(.*)(<.*>)/Ums','my_quote',$test);
echo $test;
echo "<hr>";
echo $neu;
?>
Sup!
s/((?:<[^>]*?>)*?[^<]*?)*?"/$1"/g;
Vielleicht geht das ja. Wenn nicht... Pech. Aber es geht auf jeden Fall irgendwie so.
Gruesse,
Bio
Hi,
so jetzt habe ich doch noch eine halbwegs akzeptable (PHP-) Lösung gefunden. War gar nicht so schlimm wie ich zunächst dachte.
kannste mal sehen :-)
Allerdings klappt das Beispiel nicht für den Teil am Ende.
Vielleicht kann jemand von Euch helfen?
Ich kann Dir die Perl-Doku anbieten. Der Algorithmus sollte sich auch auf PHP anpassen lassen:
perldoc perlfaq4
"""
How can I split a [character] delimited string except when inside [character]? (Comma-separated files)
[...] For example, take a data line like this:
SAR001,"","Cimetrix, Inc","Bob Smith","CAM",N,8,1,0,7,"Error, Core Dumped"
[...]
@new = ();
push(@new, $+) while $text =~ m{
"([^"\]*(?:\.[^"\]*)*)",? # groups the phrase inside the quotes
| ([^,]+),?
| ,
}gx;
push(@new, undef) if substr($text,-1,1) eq ',';
[...]
"""
Mit "@" beginnende Variablen sind Arrays, "$text =~ m{...}" ist eine Matching-RegExp.
Cheatah
Hallo Forumer
so nachdem ich jetzt stundenlang herumprobiert habe und der Code zuerst immer länger, und dann immer kürzer wurde, hier also das vorläufige Endergebnis für die, die es interessiert. Vielleicht hat ja jemand Verwendung dafür.
Vielen Dank und viele Grüße
Euer Dieter
<?php
class my_french_quote
{
function french_quote($v)
{
$pattern=array('/\b"/','/"\b/');
$replacement=array('«','»');
return preg_replace($pattern,$replacement,$v);
}
function do_quote($v)
{
return $v[1].$this->french_quote($v[2]);
}
function quote()
{
return preg_replace_callback('/(>|^)([^<]*)/ms', array($this,'do_quote'),$this->value);
}
function my_french_quote($v)
{
$this->value=$v;
}
}
$test='"Hallo" das ist ein "Test" um zu testen, und natürlich ein Link nach <a href="http://www.dummy.de">"irgendwo"</a> <img src="test.jpg" width="100"> und am "Ende"';
$fq= new my_french_quote($test);
echo $fq->quote();
?>