2013-02-18 140 views
9

好的,所以我一直在摔跤这个正则表达式的年龄,我不能得到它的工作。PHP的正则表达式匹配词

我想要做什么:

给定一个字符串我想字符串包含单词的数组,每个任何非单词字符之后。

实施例的输入字符串:

one "two" (three) -four-

字符串中的词语可以是任何东西,甚至乱码,标点符号或符号的任何量。

我想看到什么:

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

从本质上讲,每场比赛的最后一件事是一个词,被任何东西从以前的比赛遗留下来之前。我尝试了preg_match_all()和preg_split()的各种组合,其中包含许多“\ w”,“\ b”,“[^\ w]“等等。

更大的图片

基本上我只是想将一个*字符串供搜索中的每个单词后。

我真的不是一个正则表达式的人,所以帮助表示赞赏!

+0

在你的*我想看到的*部分,是'四'应该是在下一行后的报价? – LeonardChallis 2013-02-18 17:48:51

+0

你是对的,当我发布时引号似乎已经改变,我现在已经修复了,希望他们这次能够正确地通过。 – Testic 2013-02-18 17:54:36

回答

8

如果你只是想每一个 “字” 后添加一个星号,你可以这样做:

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

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

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

+0

这也很出色!我可能会使用这个,因为它可以帮助我避免在比赛中循环。 – Testic 2013-02-18 18:03:15

7

可以使用负先行拆分单词边界,就像这样:

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

一个print_r($array);gives you所需的精确输出:

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

这工作出色! – Testic 2013-02-18 18:02:02

0

这里的如何找到一个字一个例子与PHP中的正则表达式。

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

另一种

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

你需要匹配!