采用以下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$/']
是否有可以使用的功能,或者我是否必须从头开始创建一个相当技术的功能?
如果有人愿意试一试,那就值得称赞。
答案 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$/
正确的答案是4
和5
字 - 表示不一致。
/^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)
// }
尝试做某事很好,不可能是一种有趣的练习。