PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Strings ersetzen mit Regex (https://www.php-resource.de/forum/php-developer-forum/94017-strings-ersetzen-mit-regex.html)

Riddler 07-10-2008 11:53

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

Griecherus 07-10-2008 12:56

Und was spricht gegen ein simples
Code:

/^'([^']+)'$/
? :)

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

Grüße

asp2php 07-10-2008 13:00

oder das: /'(.*)'/is

Riddler 07-10-2008 13:39

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

Griecherus 07-10-2008 13:44

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

Grüße

Riddler 07-10-2008 13:54

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.

Griecherus 07-10-2008 14:11

'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?

TobiaZ 07-10-2008 14:13

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.

Riddler 07-10-2008 14:34

@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

Griecherus 07-10-2008 14:49

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

Griecherus 07-10-2008 15:21

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.

alex2iceman 08-10-2008 10:04

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.

alex2iceman 08-10-2008 10:05

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"

alex2iceman 08-10-2008 10:12

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.

TobiaZ 08-10-2008 12:09

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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:39 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG