PHP匹配文本并从文本文件中删除整行

时间:2017-07-24 17:13:26

标签: php regex preg-replace preg-match

我有一个文本文件,我想删除完全包含某些字符的行。例如,像这样的文本文件,我想要删除包含中文字符的行:

A.我不要这些汉字
Ok I see
有人会懂我写的吗?
Why not then?
我看够呛。
This is just an example

$myfile = "somtext.txt";
$handle = fopen($myfile, "r");
$book = fread($handle, filesize($myfile));
fclose($handle);

$book = preg_replace("/\p{Han}+/u","", $book);

echo nl2br($book);

但是使用这段代码,中文会被删除,但标点符号会被保留,并且任何字母数字字符都会留在行上。此外,线路本身仍然存在。它最终是这样的:

A.
Ok I see
?
Why not then?
。
This is just an example

但我需要它看起来像这样:

Ok I see
Why not then?
This is just an example

编辑:我想在将其转换为数组之前执行此操作。

4 个答案:

答案 0 :(得分:1)

(注意 - 需要Unicode标志)

您可以输入所有(?m)^.*?[class].*(?:\r?\n|\z)块的所有属性 所有块的总和应该为您提供大多数亚洲字符的脚本 它不像中文,日文,韩文,越南文的单独脚本 这些字符混杂在语言之间。我认为 Han 可能还不够。

此外,关于块的事情是它们内部的一些未使用的代码点 保留用于将来的扩展,但块参考不会改变 这是一种面向未来的Unicode更新的方法,其中引擎编写者可能不会 及时更新其脚本(不包含未使用的代码点)。

这只是一个匹配单个字符的类。

有关CJK代表的信息,请参阅此http://www.unicode.org/faq/han_cjk.html

要查找/删除该行,请使用[\p{Block=Kangxi_Radicals}\p{Block=CJK_Compatibility}\p{Block=CJK_Compatibility_Forms}\p{Block=CJK_Compatibility_Ideographs}\p{Block=CJK_Compatibility_Ideographs_Supplement}\p{Block=CJK_Radicals_Supplement}\p{Block=CJK_Strokes}\p{Block=CJK_Symbols_And_Punctuation}\p{Block=CJK_Unified_Ideographs}\p{Block=CJK_Unified_Ideographs_Extension_A}\p{Block=CJK_Unified_Ideographs_Extension_B}\p{Block=CJK_Unified_Ideographs_Extension_C}\p{Block=CJK_Unified_Ideographs_Extension_D}\p{Block=CJK_Unified_Ideographs_Extension_E}\p{Block=Enclosed_CJK_Letters_And_Months}]

[\x{2E80}-\x{2FDF}\x{3000}-\x{303F}\x{31C0}-\x{31EF}\x{3200}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE4F}\x{20000}-\x{2A6DF}\x{2A700}-\x{2CEAF}\x{2F800}-\x{2FA1F}]

或者,只使用代码点范围 这适用于Unicode 9.

#include<stdio.h> void main() { int a,b[100],i; printf("Enter the total numbers:\n"); scanf("%d",&a); printf("Enter the numbers:\n"); for(i=0;i<a;i++) { scanf("%d",&b[i]); } for(i=a-1;i>=0;i++) { printf("%d\n",b[i]); } }

答案 1 :(得分:1)

您写道,您希望在删除文件中不需要的部分后创建一系列行。但是你可以根据加载(和可接受)的行来构建它。这样您就不必在内存中存储您不想要的行。

要做到这一点,你必须编写一个只生成正确行的生成器:

function getLine($handle, $buffer = 2048, $sep = "\n") {
    while ( false !== $line = stream_get_line($handle, $buffer, $sep) ) {
        if ( preg_match('~^\P{Han}+$~u', $line) )
            yield $line;
    }
}

$myfile = "somtext.txt";

if ( false === $handle = fopen($myfile, "r") )
    throw new Exception("Unable to open file '$myfile'\n");

$result = iterator_to_array(getLine($handle));

fclose($handle);

print_r($result);

答案 2 :(得分:0)

这是一个正在执行您正在寻找的正则表达式:

.+?(?=[^\x00-\x7F]).*(?=\n)\n

如果您想要一个例子:https://regex101.com/r/U6ngPi/2

编辑(解释):

从一行开始,如果前面有非ASCII字符(.+?(?=[^\x00-\x7F]),取自here),则查找所有字符

匹配所有字符(.*

检查是否存在换行符,使用与之前类似的逻辑进行前瞻((?=\n)\n),然后包含换行符

答案 3 :(得分:0)

尝试将此字符串作为匹配的字符串“/(。)\ p {Han} +(。)\ n / uD”

它捕获其他(非中文)字符以及最后的换行符。