2013-02-18 10 views
9

OK, więc walczyłem z tym regex od wieków i nie mogę go uruchomić.Wyrażenie regularne PHP, aby dopasować słowa

Co chcę zrobić:

Biorąc pod uwagę ciąg chcę tablicę ciągów zawierających słowa, każdy poprzedzony żadnych znaków non-słownych.

Przykład wejściowy łańcuch:

one "two" (three) -four-

słowa w łańcuchu może być dowolny, nawet bezsensownego z dowolnej ilości znaków interpunkcyjnych lub symboli.

Co chciałbym zobaczyć:

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

Zasadniczo dla każdego meczu ostatnią rzeczą jest to słowo, poprzedzone cokolwiek pozostały z poprzedniego meczu.

Jak zaznaczono w tym pytaniu tytuł będę używał tego w PHP, próbowałem różnych kombinacji preg_match_all() i preg_split(), z wzorami zawierającymi wiele odmian "\ w", "\ b", "[^\ w] "i tak dalej.

Bigger Picture

Zasadniczo po prostu chcesz umieścić * po każdym słowie w ciągu celach poszukiwania.

Naprawdę nie jestem osobą regularną, więc pomoc jest doceniana!

+0

W twoim * czym chciałbym zobaczyć * część, czy cytat po "czterech" powinien znajdować się w następnej linii? – LeonardChallis

+0

Masz rację, wydaje mi się, że cytaty zostały zmienione, kiedy pisałem, naprawiłem to teraz, mam nadzieję, że tym razem przejrzały poprawnie. – Testic

Odpowiedz

8

Jeśli chcesz po prostu dodać gwiazdkę po każdej "Słowo" można to zrobić:

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

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

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

+0

To również działa wspaniale! Prawdopodobnie użyję tego, ponieważ oszczędza mi to późniejszego przechodzenia przez mecze. – Testic

7

Można użyć negatywny uprzedzona podzielić na granicy słów, jak to:

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

print_r($array);gives you dokładna wyjście życzenia:

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

To działa wspaniale! – Testic

0

tutaj przykładem, jak znaleźć słowo z regex w PHP.

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

Alternatywą

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

Trzeba dopasować !

Powiązane problemy