php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 07-10-2008, 11:53
Riddler
 Newbie
Links : Onlinestatus : Riddler ist offline
Registriert seit: Oct 2008
Beiträge: 4
Riddler ist zur Zeit noch ein unbeschriebenes Blatt
Standard Strings ersetzen mit Regex

Moin Moin,

bin neu hier und hab ein kleines Regex Problem. Hoffe mir kann da jemand helfen.

Ich möchte aus einem PHP-Code mittels preg_replace, Strings mit einfachen Anführungszeichen ersetzen lassen.

Also so etwas:
PHP-Code:
$string 'Das ist
ein String über 
mehrere Zeilen'

Jetzt möchte ich alles zwischen ' und ' suchen lassen. Das ist auch kein Problem, aber jetzt kommt der schwere Teil.
Das soll er nur machen, wenn der Teil nicht zwischen " und " steht.

Also so z.B.:
PHP-Code:
$string "'"// soll nicht erkannt werden
$string "Das ist ein String mit einem ' darin"
// Jetzt würde er mit preg_replace bei dem ' anfangen. 
// Das soll er aber nicht, weil es zwischen " und " steht 
Mein Ansatz ist bis jetzt folgender:
PHP-Code:
$code preg_replace("#(?<!\")('.*?')(?!\")#is"'<span style="color:#CC0000;">$1</span>'$code); 
Das funktioniert aber nur wenn die Zeichen direkt davor und dahinter sind und nicht wenn es irgendwo dazwischen steht.

Ich hoffe man versteht was ich meine...

Gruß
Riddler

Geändert von Riddler (07-10-2008 um 14:51 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 07-10-2008, 12:56
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Und was spricht gegen ein simples
Code:
/^'([^']+)'$/
?

(Funktioniert natürlich nicht, wenn der Single-Qouted-String selbst Teil eines Strings ist.)

Grüße

Geändert von Griecherus (07-10-2008 um 12:58 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 07-10-2008, 13:00
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Question

oder das: /'(.*)'/is
Mit Zitat antworten
  #4 (permalink)  
Alt 07-10-2008, 13:39
Riddler
 Newbie
Links : Onlinestatus : Riddler ist offline
Registriert seit: Oct 2008
Beiträge: 4
Riddler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke aber das funzt leider nicht.

Um mal ein einfaches Beispiel zu machen.
Ich habe folgenden Text und möchte jetzt ein Pattern haben, was die grün markierten Stellen findet und als Backreference zurück gibt.

'Das ist ein Text'
"Das ist ein 'Text' mit Single Quotes"
'Das ist ein "Text" mit Double Quotes'
''
"'"

Also im Prinzip möchte ich alle Stellen finden, die zwischen Single Quotes stehen inklusive selbiger.
Das aber nur wenn diese Stelle nicht zwischen zwei Double Quotes steht.

Mit meinem Pattern klappt das zwar, aber nur bei "'" und nicht bei bespielsweise " ' ".

Gruß
Riddler
Mit Zitat antworten
  #5 (permalink)  
Alt 07-10-2008, 13:44
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Und genau das macht mein Pattern (oder ich verstehe dich falsch).

Grüße
Mit Zitat antworten
  #6 (permalink)  
Alt 07-10-2008, 13:54
Riddler
 Newbie
Links : Onlinestatus : Riddler ist offline
Registriert seit: Oct 2008
Beiträge: 4
Riddler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nein leider nicht.
Habs mit dem Regex-Tester und meinem Beispiel Text probiert.
Leider keine Treffer...
Und das rot markierte in meinem Beispiel soll auch nicht gefunden werden.
Mit Zitat antworten
  #7 (permalink)  
Alt 07-10-2008, 14:11
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

'Das ist ein Text'
-> Check

"Das ist ein 'Text' mit Single Quotes"
-> Check

'Das ist ein "Text" mit Double Quotes'
-> Check

''
-> Mach aus [^']+ ein [^']*, dann klappt auch das

"'"
-> Check

Wo ist das Problem?
Mit Zitat antworten
  #8 (permalink)  
Alt 07-10-2008, 14:13
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Habs mit dem Regex-Tester und meinem Beispiel Text probiert.
Benutz doch bitte den http://Regexp-Evaluator.de vom Hund, da kannst du deine Ergebnisse auch verlinken.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #9 (permalink)  
Alt 07-10-2008, 14:34
Riddler
 Newbie
Links : Onlinestatus : Riddler ist offline
Registriert seit: Oct 2008
Beiträge: 4
Riddler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@TobiaZ
werd ich machen

@Griecherus
Wenn ich das zeilenweise teste dann geht das schon, aber ich möchte das ja auf den ganzen Text anwenden, auch über mehrere Zeilen hinweg und da gehts leider nicht mehr...

Siehe hier
Mit Zitat antworten
  #10 (permalink)  
Alt 07-10-2008, 14:49
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

OK, das hätte natürlich als Anforderung erwähnen können.
Das macht das Ganze komplizierter. Eine Regex, die das ohne Weiteres löst, kommt mir spontan nicht in den Sinn. Du könntest es aber auch über Umwege lösen.
Was mir spontan einfällt:
- alle Zeichenfolgen, die in Double-Quotes stehen, entfernen, damit dürften dann nur noch "gültige" Single-Quoted Strings übrig bleiben

- oder String Zeichen für Zeichen parsen, bei Vorkommen eines Double-Quotes Flag setzen und Single-Quotes ignorieren, bis schließendes Double-Quote gefunden wurde

P.S. Bitte Überbreite deines ersten Postings korrigieren.


Grüße
Mit Zitat antworten
  #11 (permalink)  
Alt 07-10-2008, 15:21
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich hab mal auf die Schnelle etwas zusammengeschustert:
PHP-Code:

// Zustand: in single-quotes
$in_sq false;
// Zustand: in double-quotes
$in_dq false;

foreach (
str_split($str) as $chunk)
{
    switch (
$chunk)
    {
        case 
'"':
            
$in_dq = ($in_dq === false) ? true false;
            break;
    
        case 
"'":    
            
$in_sq = ($in_sq === false) ? true false;
            break;
            
        default:
        
            if ((
$in_sq === true) and ($in_dq === false))
            {
                
// Zustand: Zeichenfolge in single-quotes, die
                // nicht von double-quotes umgeben ist
            
}
    }

Ist sicherlich nicht elegant, sollte aber funktionieren.
Mit Zitat antworten
  #12 (permalink)  
Alt 08-10-2008, 10:04
alex2iceman
 Registrierter Benutzer
Links : Onlinestatus : alex2iceman ist offline
Registriert seit: May 2007
Beiträge: 120
alex2iceman ist zur Zeit noch ein unbeschriebenes Blatt
Standard

versuch das mal:

PHP-Code:
preg_match_all("|\'(.*)\'|U",$string,$ausgabePREG_SET_ORDER); 
Damit habe ich zuletzt erfolgreich genau das bewirkt, was du beschreibst.

Im Prinzip müsste in $ausgabe[0][0] das stehen was du brauchst.
Mit Zitat antworten
  #13 (permalink)  
Alt 08-10-2008, 10:05
alex2iceman
 Registrierter Benutzer
Links : Onlinestatus : alex2iceman ist offline
Registriert seit: May 2007
Beiträge: 120
alex2iceman ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Riddler
Danke aber das funzt leider nicht.

Um mal ein einfaches Beispiel zu machen.
Ich habe folgenden Text und möchte jetzt ein Pattern haben, was die grün markierten Stellen findet und als Backreference zurück gibt.

'Das ist ein Text'
"Das ist ein 'Text' mit Single Quotes"
'Das ist ein "Text" mit Double Quotes'
''
"'"

Also im Prinzip möchte ich alle Stellen finden, die zwischen Single Quotes stehen inklusive selbiger.
Das aber nur wenn diese Stelle nicht zwischen zwei Double Quotes steht.

Mit meinem Pattern klappt das zwar, aber nur bei "'" und nicht bei bespielsweise " ' ".

Gruß
Riddler
Ach sorry mein Beispiel greift nicht hier:
"Das ist ein 'Text' mit Single Quotes"
Mit Zitat antworten
  #14 (permalink)  
Alt 08-10-2008, 10:12
alex2iceman
 Registrierter Benutzer
Links : Onlinestatus : alex2iceman ist offline
Registriert seit: May 2007
Beiträge: 120
alex2iceman ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Sorry für spamming, aber ich habe da noch eine Idee:

PHP-Code:
preg_match_all("|\"(.*)\"|U",$string,$ausgabeDoublePREG_SET_ORDER);
preg_match_all("|\'(.*)\'|U",$string,$ausgabeSinglePREG_SET_ORDER);

if (
strpos($ausgabeDouble[0][1],$ausgabeSingle[0][1])===false){
    
//Text in Single Quotes befindet sich nicht im String mit Double Quotes
}else{
    
//Verwerfen

(Die SingleQuotes maskieren, wird hier vom Parser weggeschnitten)
Würde mich mal interessieren, ob das was wert ist.

Geändert von alex2iceman (08-10-2008 um 10:15 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 08-10-2008, 12:09
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von alex2iceman
Ach sorry mein Beispiel greift nicht hier:
"Das ist ein 'Text' mit Single Quotes"
Soller auch gar nicht, oder? Ist doch rot satt grün markiert.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:01 Uhr.