Php 使用preg_match_all和正则表达式创建一个单词数组
我正在使用下面的PHP函数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
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,
谢谢,是的,这些单词后面没有空格。我对它进行了进一步的编辑。