我试图获取一个行列表,并让PHP只输出包含相同单词(变量)两次的行。它应该匹配单词的单数和复数版本。
行列表示例:
这是所有网站的最佳网站
这是一个很棒的网站
这是我在寻找网站时找到的网站
网站是一个很酷的新词
我会将这些行放入文本框中,然后输出脚本:
这是所有网站的最佳网站
这是我在寻找网站时找到的网站
不需要显示任何计数,只需要包含两次单词的原始行。
我在操纵线条方面相当不错,但我到处寻找答案,似乎不存在。
答案 0 :(得分:1)
出于测试目的,我没有使用类似$text = $_POST['text'];
的内容,而是使用了一个变量来存储文本。另外,我用来复数单词的类来自here。
注意: 我回滚了答案以解决问题,之前的答案是试图解决评论的问题已被移动{ {3}} 子>
<?php
$text = "This is a best website of all the websites out there
This is a great website
Here is a website I found while looking for websites
Website is a cool new word';
// helps us pluralize all words, so we can check the duplicates
include('class.php');
// loop into each line one by one
foreach(explode("\n", $text) as $line)
{
// remove special characters
$tline = preg_replace('/[^A-Za-z0-9\-\s]/', '', $line);
// create a list of words from current line
$words_list = preg_split('/\s+/', strtolower($tline));
// convert all singular words to plural
foreach($words_list as $word)
{
$w[] = Inflect::pluralize($word);
}
// if the count of words in this line was bigger that of unique
// words then we got some duplicates, echo this line out
if( count($w) > count(array_unique($w)) )
echo $line . '</br>';
// empty the array for next line
$w = [];
}
所需文字的输出为:
This is a best website of all the websites out there
Here is a website I found while looking for websites
然而,代码的正确性实际上取决于我们的复数方法是如何工作的。
首先,我逐个循环到每一行,在每次迭代我都是从那行开始的单词列表,然后我们应该将所有单数单词转换为复数(或复数到单数,它不会真的很重要),现在我有一个单词列表,所有单词都是复数,我可以很容易地检查它们,看看它们是否都是唯一的,如果该行上的单词数量大于唯一的单词数量然后,我可以发现那里有重复的单词,所以我应该打印出那条线。