Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 以点为基础拆分句子,不要被博士、先生等词所束缚_Php_Regex - Fatal编程技术网

Php 以点为基础拆分句子,不要被博士、先生等词所束缚

Php 以点为基础拆分句子,不要被博士、先生等词所束缚,php,regex,Php,Regex,我想用“.”这样的句号把一篇文章分成几个句子。但是,如果文本中存在诸如“Dr.”、“Mrs.”、“U.S.A.”等词,那么拆分器可能会混淆。例如,考虑下面的文本: 《憨豆先生》是一部英国喜剧电视连续剧 这可以分成两句话: 1:李先生。 《憨豆》是一部英国喜剧电视剧 有没有一种聪明的方法可以在PHP中解决这个问题,而不用使用这种特殊单词的字典/数组 顺便说一句,我使用了下面的代码来检查给定的单词是否有fullstop。这段代码运行得很好,但我需要用大量这样的单词填充字典/数组。我正在寻找一个解决方

我想用“.”这样的句号把一篇文章分成几个句子。但是,如果文本中存在诸如“Dr.”、“Mrs.”、“U.S.A.”等词,那么拆分器可能会混淆。例如,考虑下面的文本:

《憨豆先生》是一部英国喜剧电视连续剧

这可以分成两句话: 1:李先生。 《憨豆》是一部英国喜剧电视剧

有没有一种聪明的方法可以在PHP中解决这个问题,而不用使用这种特殊单词的字典/数组

顺便说一句,我使用了下面的代码来检查给定的单词是否有fullstop。这段代码运行得很好,但我需要用大量这样的单词填充字典/数组。我正在寻找一个解决方案,不需要任何字典。现在,有什么想法吗

public function doesWordHasFullstop($word){
if(in_array(strtolower(trim($word)), array('dr.','mr.','mrs.','prof.','ms.','sr.','jr.','m.sc.'
                              ,'b.sc.','ph.d.','st.', 'gen.','sen.','rep.','jan.',
                              'feb.','mar.', 'apr.','jun.','jul.','aug.','sep.',
                              'oct.','nov.','dec.','drs.','m.d.','b.a.','m.a.','d.d.s.',
                              'u.s.a','u.a.e','u.k.','p.m.','a.m.'))){
    return FALSE;
}
preg_match('/[.,;):>\]?!@#|]+/', $word, $matches);
if(count($matches)>0){
    return TRUE;
}else{
    return FALSE;
}

}

嗯,你不能使用字典,而是数组

function SplitAtSentance($Criteria,$Word){
    $Word = explode (" ",$Word);
    foreach ($Criteria AS $Keys => $Values){
        if (in_array($Values,$Word)){
            $New = implode(" ",$Word);
            return str_replace($Values, $Values."<br>",$New);
        }
    }
    return false;

}

$Array = array ("Mr","ms");
$Original = "Mr Daryl";

echo SplitAtSentance($Array,$Original);
以下是我当前的设置:

$Contents = file_get_contents("../test.txt");
function SplitAtSentance($Criteria,$Word){
$Word = explode (" ",$Word);
foreach ($Criteria AS $Keys => $Values){
    if (in_array($Values,$Word)){
        $New = implode(" ",$Word);
        return str_replace($Values, $Values."<br>",$New);
    }
}
return false;

}

$Contents = explode(",",$Contents);
$Sentance = "Dear mr Gill";
echo SplitAtSentance($Contents,$Sentance);
以及文件结构: 代码段所在的HTDOCS/TextDoc text.txt所在的HTDOCS

../将返回目录并加载包含以下内容的文本文档:

先生,先生,硕士,博士,博士,博士


不是为了让你气馁,但这实际上是不可能的。考虑下面的句子:

格里芬一家住在斯普纳街,辛普森一家住在常青街

除非你愿意依赖更不可靠的标记,如大写,否则你必须承认,你唯一能分辨第二个句号的方法是同时标记缩略词的结尾和句子的结尾,而第一个句号只有第一个句号需要进行全面的句法分析,用自然语言是不可能的


是的,我知道辛普森一家住在长荣台,但我想说明这个问题。

唯一的选择是语法分析器,这显然更复杂,仍然需要某种形式的词典。PHP不懂英语,当然也不了解流行文化。这就是你想要的解析句子的方法。我同意@JorgeCampos-?给我们一本。毫无例外的字典,你需要做一些假设,比如,如果句号前面有1-3个字母,第一个字母是大写,忽略它,因为Mr是,在英式英语中,它不应该后跟句号。谢谢,但这与我自己的代码类似,它还需要手动添加很多单词。你会怎么想呢?PHP不知道任何口头/书面语言,除非告诉actwell,否则它不会对任何东西起作用。这是智能编程的要点。我仍然相信这个问题可以通过某种智能正则表达式模式来解决。但我还不知道怎么做@user2957386如果您正在寻找一个正则表达式,它将匹配广泛的单词,这不是一个答案,而是一个大脑疼痛。将所有这些单词存储在文本文件/数据库/数组中,然后从那里开始工作。。它还提供了在任意点扩展条件的能力,只需将另一个元素添加到您选择的任何存储选项中即可。。而是必须创建一个新的正则表达式/一系列表达式来匹配新的条件。这有点没用。例如,我需要用数千个单词填充数组,如“2:00”、“20:00”、“200:000”,等等!