2

我不擅长正则表达式,但我想用它从字符串中提取单词。

我需要的单词至少应包含 4 个字符,并且提供的字符串可以是 utf8。

示例字符串:

Sus azahares presentan gruesos pétalos blancos teñidos de rosa o violáceo en la parte externa, con numerosos estambares (20-40)。

期望的输出:

Array(
    [0] => azahares
    [1] => presentan
    [2] => gruesos
    [3] => pétalos
    [4] => blancos
    [5] => teñidos
    [6] => rosa
    [7] => violáceo
    [8] => parte
    [9] => externa
    [10] => numerosos
    [11] => estambres
)
4

7 回答 7

8

如果要查找的单词是 UTF-8(根据规范至少 4 个字符长),由 ISO-8859-15 的字母字符组成(这对于西班牙语很好,但也适用于英语、德语、法语、 ETC。):

$n_words = preg_match_all('/([a-zA-Z]|\xC3[\x80-\x96\x98-\xB6\xB8-\xBF]|\xC5[\x92\x93\xA0\xA1\xB8\xBD\xBE]){4,}/', $str, $match_arr);
$word_arr = $match_arr[0];
于 2012-05-21T12:44:35.330 回答
6

您可以将下面的正则表达式用于简单的字符串。它将匹配任何最小长度 = 4 的非空白字符。

preg_match_all('/(\S{4,})/i', $str, $m);

现在$m[1]包含您想要的数组。

更新:

正如 Gordon 所说,该模式也将匹配“(20-40)”。可以使用此正则表达式删除不需要的数字:

preg_match_all('/(\pL{4,})/iu', $str, $m);

但我认为它只有在 PCRE 编译时支持 UTF-8 才有效。请参阅PHP PCRE (regex) does not support UTF-8? . 它可以在我的电脑上运行。

于 2012-05-21T11:28:03.073 回答
3

那应该为您完成工作

function extractCommonWords($string) {
    $stopWords = array('i','a','about','an','and','are','as','at','be','by','com','de','en','for','from','how','in','is','it','la','of','on','or','that','the','this','to','was','what','when','where','who','will','with','und','the','www');

    $string = preg_replace('/\s\s+/i', '', $string); //echo $string, "<br /><br />"; // replace whitespace
    $string = trim($string); // trim the string
    $string = preg_replace('/[^a-zA-Z0-9 -_]/', '', $string); // only take alphanumerical characters, but keep the spaces and dashes too…
    $string = strtolower($string); // make it lowercase

    preg_match_all('/([a-zA-Z]|\xC3[\x80-\x96\x98-\xB6\xB8-\xBF]|\xC5[\x92\x93\xA0\xA1\xB8\xBD\xBE]){4,}/', $string, $matchWords);
    $matchWords = $matchWords[0];

    foreach($matchWords as $key => $item) {
        if($item == '' || in_array(strtolower($item), $stopWords) || strlen($item) <= 3) {
            unset($matchWords[$key]);
        }
    }

    $wordCountArr = array();
    if(is_array($matchWords)) {
        foreach($matchWords as $key => $val) {
            $val = strtolower($val);
            if(isset($wordCountArr[$val])) {
                $wordCountArr[$val]++;
            } else {
                $wordCountArr[$val] = 1;
            }
        }
    }

    arsort($wordCountArr);
    $wordCountArr = array_slice($wordCountArr, 0, 10);
    return $wordCountArr;
}
于 2014-02-18T04:52:19.220 回答
2

使用u修饰符时,可以使用以下模式(demo):

preg_match_all('(\w{4,})u', $string, $matches);
print_r($matches[0]);

u修饰符的意思是:

u (PCRE_UTF8):此修饰符打开与 Perl 不兼容的 PCRE 的附加功能。模式字符串被视为 UTF-8。此修饰符在 Unix 上的 PHP 4.1.0 或更高版本以及 win32 上的 PHP 4.2.3 中可用。自 PHP 4.3.5 起检查模式的 UTF-8 有效性。

于 2012-05-21T11:50:37.440 回答
1

用空格分解你的字符串(这将创建一个包含所有单词的数组),然后检查单词是否大于 4 个字母。

//The string you want to explode
$string = "Sus azahares presentan gruesos pétalos blancos teñidos de rosa o violáceo en la parte externa, con numerosos estambres."
//explode your $string, which will create an array which we will call $words
$words = explode(' ', $string);

//for each $word in $words
foreach($words as $word)
{
    //check if $word length if larger then 4
    if(strlen($word) > 4)
    {
        //echo the $word
        echo $word;
    }
}

strlen();

strlen — 获取字符串长度

爆炸();

explode — 逐个字符串拆分

于 2012-05-21T11:21:50.003 回答
0
$string = Sus azahares presentan gruesos pétalos blancos teñidos de rosa o violáceo en la parte externa, con numerosos estambres

$words = explode(' ', $string);
echo $words[0];
echo $words[1];

等等

于 2012-05-21T11:22:57.163 回答
0

试试这个:

$str='Sus azahares presentan gruesos pétalos blancos teñidos de rosa o violáceo en la parte externa, con numerosos estambres (20-40).';
preg_match_all('/([^0-9\s]){4,}/i', $str, $matches);
echo '<pre>';
var_dump($matches);
echo '</pre>';
于 2012-05-21T11:47:49.767 回答