有人可以向我解释如何使用preg_split()函数吗?
我不理解像"/[\s,]+/"
这样的模式参数。
例如:
我有这个主题:is is.
我希望结果是:
array (
0 => 'is',
1 => 'is',
)
所以它会忽略空间和句号,我怎么能这样做?
答案 0 :(得分:32)
preg
表示 P cre REG exp",这是多余的,因为" PCRE"意味着" Perl兼容Regexp"。
Regexps对初学者来说是一场噩梦。我仍然没有完全理解他们,我已经和他们合作多年了。
基本上你在那里的例子,分解是:
"/[\s,]+/"
/ = start or end of pattern string
[ ... ] = grouping of characters
+ = one or more of the preceeding character or group
\s = Any whitespace character (space, tab).
, = the literal comma character
所以你有一个搜索模式,它被分成字符串的任何部分,至少有一个空白字符和/或一个或多个逗号"。
其他常见字符是:
. = any single character
* = any number of the preceeding character or group
^ (at start of pattern) = The start of the string
$ (at end of pattern) = The end of the string
^ (inside [...]) = "NOT" the following character
对于PHP,the official documentation中有很好的信息。
答案 1 :(得分:7)
这应该有效:
$words = preg_split("/(?<=\w)\b\s*[!?.]*/", 'is is.', -1, PREG_SPLIT_NO_EMPTY);
echo '<pre>';
print_r($words);
echo '</pre>';
输出结果为:
Array
(
[0] => is
[1] => is
)
在我解释正则表达式之前,只需对PREG_SPLIT_NO_EMPTY
进行解释。这基本上意味着如果结果不为空,则仅返回preg_split
的结果。这可以确保数组$words
中返回的数据确实包含数据。不仅仅是处理正则表达式模式时可能发生的空值。混合数据源。
可以使用this tool:
对这个正则表达式的解释进行分解NODE EXPLANATION
--------------------------------------------------------------------------------
(?<= look behind to see if there is:
--------------------------------------------------------------------------------
\w word characters (a-z, A-Z, 0-9, _)
--------------------------------------------------------------------------------
) end of look-behind
--------------------------------------------------------------------------------
\b the boundary between a word char (\w) and
something that is not a word char
--------------------------------------------------------------------------------
\s* whitespace (\n, \r, \t, \f, and " ") (0 or
more times (matching the most amount
possible))
--------------------------------------------------------------------------------
[!?.]* any character of: '!', '?', '.' (0 or more
times (matching the most amount possible))
通过在this other other tool中输入/(?<=\w)\b\s*[!?.]*/
的完整正则表达式,可以找到更好的解释:
(?<=\w)
正面观察 - 断言下面的正则表达式可以匹配 \w
匹配任何字词[a-zA-Z0-9_]
\b
在字边界(^\w|\w$|\W\w|\w\W)
\s*
匹配任何空格字符 [\r\n\t\f ]
!?.
列表!?.
中的单个字符最后一个正则表达式的解释可以归结为一个人 - 也称为我 - 如下:
匹配 - 分割 - 在单词边界之前出现的任何单词字符,可以有多个空格和!?.
的标点符号。
答案 2 :(得分:1)
文档说:
preg_split()函数的操作与split()完全相同,除了 正则表达式被接受为模式的输入参数。
所以,以下代码......
<?php
$ip = "123 ,456 ,789 ,000";
$iparr = preg_split ("/[\s,]+/", $ip);
print "$iparr[0] <br />";
print "$iparr[1] <br />" ;
print "$iparr[2] <br />" ;
print "$iparr[3] <br />" ;
?>
这将产生以下结果。
123
456
789
000
所以,如果有这个主题:is is
你想要:
阵列(
0 =&gt; “是”,
1 =&gt; “是”,
)
您需要将正则表达式修改为"/[\s]+/"
除非您有is ,is
,否则您需要正则表达式"/[\s,]+/"
答案 3 :(得分:1)
PHP的str_word_count
可能是更好的选择。
str_word_count($string, 2)
将输出字符串中所有单词的数组,包括重复项。