如何在php中使用preg_split()?

时间:2014-06-12 16:42:05

标签: php preg-split

有人可以向我解释如何使用preg_split()函数吗? 我不理解像"/[\s,]+/"这样的模式参数。

例如:

我有这个主题:is is.我希望结果是:

array (
  0 => 'is',
  1 => 'is',
)

所以它会忽略空间和句号,我怎么能这样做?

4 个答案:

答案 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)将输出字符串中所有单词的数组,包括重复项。