regex 在字符串中的每个单词后添加符号

roqulrg3  于 11个月前  发布在  其他
关注(0)|答案(5)|浏览(105)

给定一个字符串,我想要一个包含单词的字符串数组,每个字符串前面都有任何非单词字符。

输入字符串示例:

第一个月
字符串中的单词可以是任何东西,甚至是乱码,带有任意数量的标点符号或符号。

我希望看到的:

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

字符串
本质上,对于每个匹配,最后一个是一个单词,前面是前一个匹配剩下的任何东西。
我将在PHP中使用它。我已经尝试了preg_match_all()和preg_split()的各种组合,其中包含“\w”,“\b”,“[^\w]”等许多变体。

大图

如何在字符串中的每个单词后面放置 * 以进行搜索?

3okqufwl

3okqufwl1#

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

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

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

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

cqoc49vn

cqoc49vn2#

你可以使用负的lookahead来分割单词边界,就像这样:

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

字符串
A print_r( $array);gives you所需的精确输出:

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

vyu0f0g1

vyu0f0g13#

“* 如何在字符串中的每个单词后面放置 * 以进行搜索?*”
你不需要捕获任何东西或使用反向引用。匹配一个或多个单词字符,然后忘记你与\K匹配的内容。零宽度位置是你注入星号的地方。
产品编号:(Demo

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

echo preg_replace('/\w+\K/', '*', $test);

字符串
如果你想拆分字符串,建议仍然存在。Demo

var_export(
    preg_split('/\w+\K/', $test)
);


作为要求的扩展,以显示单词边界是如何工作的...

  • var_export(preg_split('/\b/', $test));将在每个单词字符序列之前和之后拆分。Demo
  • echo preg_replace('/\b/', '*', $test);将在每个单词字符序列的前后添加一个空格。Demo
drnojrws

drnojrws4#

下面是一个如何在PHP中使用正则表达式查找单词的例子。

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

字符串

aor9mmx1

aor9mmx15#

替代方案

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

字符串
你需要匹配!

相关问题