PHP - 计算正则表达式模式中的总字数

时间:2016-11-08 13:04:00

标签: php regex

采用以下PHP正则表达式:

$data_id = INPUT::get("data_id");

我想确定模式中可用单词的总数。正确的答案是/^(what is|tell me) your name$/,因为以下组合是兼容的:

4

一个简单的what is your name => 4 words tell me your name => 4 words 不会削减它,因为count(explode(' ', '/^(what is|tell me) your name$/'))函数会返回以下内容:

explode

...定义5"单词",当真的,在模式中只有4个可用。

这是另一个例子:

['/^(what', 'is|tell', 'me)', 'your', 'name$/']

是否有可以使用的功能,或者我是否必须从头开始创建一个相当技术的功能?

如果有人愿意试一试,那就值得称赞。

2 个答案:

答案 0 :(得分:1)

这是非常丑陋,但也许你可以使用一些逻辑?接缝工作。

我基本上将字符串拆分为2个不同的字符串。 $first_string是括号()之间的一部分。 我在|上展开此字符串并计算新字符串+1中的空格。

字符串$second_string的第二部分我简单地删除所有非字母字符和双空格并计算单词。

最后,我添加$first_string + $second_string以获得最终结果。

这样做的一个弱点是,如果你有一个(something | something else)的字符串,我认为我的计算空格的方法不能在|的每个网站上处理不同数量的单词。

<?php

    $string='/^(my|the) name is (\w+)$/';
    $pattern='/\(([^\)]+)\)/'; // Get text between ()
    $pattern2 = '([^a-zA-Z0-9 $])'; // all non alphabetic chars except $

    preg_match($pattern,$string, $first_string); // get text
    $first_string=explode('|', $first_string[0]); 

    $new_string = preg_replace($pattern, '', $string);
    $new_string2 = preg_replace($pattern2, '', $new_string);
    $new_string2 = removeWhiteSpace($new_string2);

    // count words
    $first_string=substr_count($first_string[0]," ")+1;
    $second_string = sizeof(explode(" ", $new_string2)); // count words

    // removes double white space
    function removeWhiteSpace($text)
    {
        $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text);
        $text = preg_replace('/([\s])\1+/', ' ', $text);
        $text = trim($text);
        return $text;
    }

    echo $first_string+$second_string; // final result


?>

答案 1 :(得分:1)

决定自己试一试,这个概念存在很多问题。这是一对夫妇:

/^(tell me|hey what is) your name$/

正确的答案是45字 - 表示不一致。

/^hey what (.+) up to$/

在这种情况下会发生什么?括号可以包含任意数量的潜在词。

所以,总而言之,函数检测确定答案的想法可能是非常愚蠢的^ o ^

然而,我试了一下,这就是我想出来的,与(.+)不相容而且相当未经检验,释放恐怖......

/**
 * Try to detect min/max amount of words in the given pattern.
 *
 * @param string $pattern
 * @param string $or_words_pattern
 * @param string $unwanted_pattern
 * @return array
 */
function regex_word_count(
    $pattern, 
    $or_words_pattern = '/\((\w|\s|\|)+\)/',
    $unwanted_pattern = '/[^a-zA-Z0-9\|\(\)\s]/')
{
    $result = ['min' => 0, 'max' => 0];
    $pattern = str_replace('\s', ' ', $pattern);
    $pattern = preg_replace($unwanted_pattern, null, $pattern);

    if (preg_match_all($or_words_pattern, $pattern, $ors)) {
        $matches = current($ors);

        foreach ($matches as $match) {
            $strings = explode('|', $match);

            foreach ($strings as $string) {
                $counts[$match][] = count(explode(' ', $string));
            }
        }

        foreach ($counts as $count) {
            $result['min'] += min($count);
            $result['max'] += max($count);
        }

        $pattern = trim(preg_replace($or_words_pattern, null, $pattern));
        $pattern = preg_replace('/\s+/', ' ', $pattern);
    }

    if (!empty($pattern)) {
        $count = count(explode(' ', $pattern));
        $result['min'] += $count;
        $result['max'] += $count;
    }

    return $result;
}

示例:

$x = regex_word_count('/^(a{3}) ([abc]) (what is the|tell me) your (name|alias dude)$/');

die(var_dump($x));

// array(2) {
//   'min' =>
//   int(6)
//   'max' =>
//   int(8)
// }

尝试做某事很好,不可能是一种有趣的练习。