正如其他人所说,这可能是一件非常棘手的事情......它遭受与一般“单词过滤”相同的所有失败(例如,人们会“掩盖”输入)。如果没有大量示例帖子进行测试,这将变得更加困难......
解决方案
无论如何,假设关键字将位于输入的其余部分的不同行并用逗号分隔,您可以将这些行与关键字匹配,如下所示:
正则表达式
#(?:^)((?:(?:[\w\.]+)(?:, ?|$))+)#m
输入
摘自您上面的问题:
[随机文本,带有逗号、点和所有]
关键字 1、关键字 2、关键字 3、关键字 4、关键字 5、
关键字 6、关键字 7、关键字 8
输出
// preg_match_all('#(?:^)((?:(?:[\w]+)(?:, ?|$))+)#m', $string, $matches);
// var_dump($matches);
array(2) {
[0]=>
array(2) {
[0]=>
string(49) "keyword1, keyword2, keyword3, keyword4, keyword5,"
[1]=>
string(31) "Keyword6, keyword7, keyword8..."
}
[1]=>
array(2) {
[0]=>
string(49) "keyword1, keyword2, keyword3, keyword4, keyword5,"
[1]=>
string(31) "Keyword6, keyword7, keyword8"
}
}
解释
#(?:^)((?:(?:[\w]+)(?:, ?|$))+)#m
#
=> 起始分隔符
(?:^)
=> 匹配非捕获组中的行首(你可以只使用^
我最初使用的|\n
并且没有更新)
(
=> 开始一个捕获组
(?:
=> 开始一个非捕获组
(?:[\w]+)
=> 匹配一个或多个单词字符的非捕获组a-zA-Z0-9_
(使用字符类,以便您可以在需要时添加到它......)
(?:, ?|$)
=> 匹配逗号(带有可选空格)或字符串/行结尾的非捕获组
)+
=> 结束非捕获组 (4) 并重复 5/6 以在该行中找到多个匹配项
)
=> 关闭捕获组 3
#
=> 结束分隔符
m
=> 多行修饰符
从 2 号开始跟进:
#^((?:(?:[\w]+)(?:, ?|$))+)#m
计算关键字
现在返回了一个只包含关键字的行数组,您可以计算逗号的数量,从而获得关键字的数量
$key_words = implode(', ', $matches[1]); // Join lines returned by preg_match_all
echo substr_count($key_words, ','); // 8
注意在大多数情况下,这将返回NUMBER_OF_KEY_WORDS - 1
(即在您的情况下为 7);它返回8
是因为您在第一行关键字的末尾有一个逗号。
链接
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
http://www.regular-expressions.info/
http://php.net/substr_count