Php 使用preg_match_all和正则表达式创建一个单词数组

Php 使用preg_match_all和正则表达式创建一个单词数组,php,regex,Php,Regex,我正在使用下面的PHP函数preg\u match\u all()创建一个包含多个单词的数组 // the string which contains the text $string = "Lorem ipsum dolor sit amet elit"; // the preg_match_all() function preg_match_all('/([a-z]*?)(?= )/i', $string, $matches); // debug array deb

我正在使用下面的PHP函数
preg\u match\u all()
创建一个包含多个单词的数组

// the string which contains the text 
$string = "Lorem ipsum dolor sit amet elit";

// the preg_match_all() function
preg_match_all('/([a-z]*?)(?= )/i', $string, $matches);

// debug array
debug($matches[0]);

// output
[(int) 0 => 'Lorem',
    (int) 1 => '',
    (int) 2 => 'ipsum',
    (int) 3 => '',
    (int) 4 => 'dolor',
    (int) 5 => '',
    (int) 6 => 'sit',
    (int) 7 => '',
    (int) 8 => 'amet',
    (int) 9 => ''
]
但当我调试或打印包含所有单词的数组时,最后一个单词将从数组中删除,在本例中,它将是单词“elit”。如何解决此问题?

您可以使用
(?=|$)
作为先行项,意思是一个单词后跟一个非单词或输入结束:

preg_match_all('/([a-z]+)(?=\W|$)/i', $string, $matches);

print_r($matches[0]);
输出:

Array
(
    [0] => Lorem
    [1] => ipsum
    [2] => dolor
    [3] => sit
    [4] => amet
    [5] => consectetur
    [6] => adipiscing
    [7] => elit
    [8] => Lorem
    [9] => ipsum
    [10] => dolor
    [11] => sit
    [12] => amet
    [13] => consectetur
    [14] => adipiscing
    [15] => elit
)
顺便说一句,您可以使用拆分操作获得相同的结果:

$tokens = preg_split('/\h+/', $string);
\h
匹配一个水平空白。

您可以使用
(?=|$)
作为先行查找,意思是一个单词后跟一个非单词或输入结束:

preg_match_all('/([a-z]+)(?=\W|$)/i', $string, $matches);

print_r($matches[0]);
输出:

Array
(
    [0] => Lorem
    [1] => ipsum
    [2] => dolor
    [3] => sit
    [4] => amet
    [5] => consectetur
    [6] => adipiscing
    [7] => elit
    [8] => Lorem
    [9] => ipsum
    [10] => dolor
    [11] => sit
    [12] => amet
    [13] => consectetur
    [14] => adipiscing
    [15] => elit
)
顺便说一句,您可以使用拆分操作获得相同的结果:

$tokens = preg_split('/\h+/', $string);

\h
匹配水平空白。

使用以下正则表达式模式获取所有单词

\w匹配任何单词字符(字母、数字、下划线)

将输出

Array
(
    [0] => Array
        (
            [0] => Lorem
            [1] => ipsum
            [2] => dolor
            [3] => sit
            [4] => amet
            [5] => consectetur
            [6] => adipiscing
            [7] => elit
            [8] => Lorem
            [9] => ipsum
            [10] => dolor
            [11] => sit
            [12] => amet
            [13] => consectetur
            [14] => adipiscing
            [15] => elit
        )

)

使用以下正则表达式模式获取所有单词

\w匹配任何单词字符(字母、数字、下划线)

将输出

Array
(
    [0] => Array
        (
            [0] => Lorem
            [1] => ipsum
            [2] => dolor
            [3] => sit
            [4] => amet
            [5] => consectetur
            [6] => adipiscing
            [7] => elit
            [8] => Lorem
            [9] => ipsum
            [10] => dolor
            [11] => sit
            [12] => amet
            [13] => consectetur
            [14] => adipiscing
            [15] => elit
        )

)

因为最后一个字后面没有空格。为什么要将前瞻与惰性匹配一起使用?只需使用
/([a-z]+)/i
。或者匹配整个单词:
/\b([a-z]+)\b/i
。为什么不使用2@CodeWhisperer我没有得到和你一样的结果。寻找正则表达式有更多的错误,比如amet,它不会被抓住,因为在最后一个单词后没有空格。为什么要将前瞻与惰性匹配一起使用?只需使用
/([a-z]+)/i
。或者匹配整个单词:
/\b([a-z]+)\b/i
。为什么不使用2@CodeWhisperer我没有得到和你一样的结果。寻找正则表达式还有很多错误,比如amet,它不会被捕获。ping@Alex Andrei将
\w+\code>更改为正确的delimeters
/\w+//code>这是一个有效的分隔符,请参见,另外,我更喜欢它,因为我不必转义前斜杠:)ping@Alex Andrei将
\w+#
更改为正确的delimeters
/\w+/
,这是一个有效的分隔符,请参阅,我也更喜欢它,因为我不必转义前斜杠:)这不匹配所有单词,缺少有逗号的。例如,
amet,
elit,
谢谢,是的,这些单词后面没有空格。我对它进行了进一步编辑。这与所有单词不匹配,缺少带逗号的单词。例如,
amet,
elit,
谢谢,是的,这些单词后面没有空格。我对它进行了进一步的编辑。