2013-02-18 20 views
9

OK, so habe ich mit diesem Regex seit Ewigkeiten Ringen und ich kann es nicht zur Arbeit bekommen.PHP regulären Ausdruck mit Worten

Was ich tun möchte:

Bei einer Zeichenfolge ich ein Array von Zeichenketten enthalten Wörter wollen, voran jeweils durch nicht zu Wort Zeichen.

Beispiel Eingabestring:

one "two" (three) -four-

Die Wörter in der Kette kann mit einer beliebigen Menge von Satzzeichen oder Symbole alles, sogar Kauderwelsch, sein.

Was Ich mag würde, um zu sehen:

array: 
one 
"two 
" (three 
) -four 
-

Wesentlichen für jeden das letzte, was passen ist ein Wort von etwas voraus, aus dem vorherigen Spiel übrig.

Wie in diesem Fragentitel erwähnt, werde ich dies in PHP verwenden, habe ich verschiedene Kombinationen von preg_match_all() und preg_split(), mit Mustern mit vielen Variationen von "\ w", "\ b", "[^\ w] "und so weiter.

The Bigger Picture

Grunde möchte ich einfach für die Suche Zwecke ein * nach jedem Wort in der Zeichenfolge platzieren.

Ich bin wirklich kein Regex-Mensch, also Hilfe wird geschätzt!

+0

In Ihrem * was ich gerne * sehen möchte, soll das Zitat nach 'vier' in der nächsten Zeile stehen? – LeonardChallis

+0

Sie haben Recht, die Zitate scheinen sich geändert zu haben, als ich gepostet habe, ich habe es jetzt behoben, hoffentlich haben sie dieses Mal richtig durchgestanden. – Testic

Antwort

8

Wenn Sie nur ein Sternchen nach jedem "Wort" hinzufügen wollen Sie dies tun könnte:

<?php 
$test = 'one "two" (three) -four-'; 

echo preg_replace('/(\w+)/', "$1*", $test); 
?> 

http://phpfiddle.org/main/code/8nr-bpb

+0

Das funktioniert auch prächtig! Ich werde wahrscheinlich dieses verwenden, da es mich davor bewahrt, die Matches zu durchlaufen. – Testic

7

Sie können eine negative Vorschau verwenden auf Wortgrenzen zu teilen, wie folgt aus:

$array = preg_split('/(?!\w)\b/', 'one "two" (three) -four-'); 

A print_r($array);gives you die genaue Ausgang gewünscht:

Array 
(
    [0] => one 
    [1] => "two 
    [2] => " (three 
    [3] =>) -four 
    [4] => - 
)
+0

Das funktioniert prächtig! – Testic

0

hier ein Beispiel, wie ein Wort zu finden, mit Regex in PHP.

<?php 
$subject = "abcdef"; 
$pattern = '/^def/'; 
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE); 
print_r($matches); 
?> 
0

Eine alternative

[^\w]*(\b\w*\b)? 
----- ---------- 
|  | 
|  |->matches a word 0 or 1 time 
|->matches 0 to many characters except [a-zA-Z0-9_] 

Sie müssen passen !