我有一个文本文件,我想删除完全包含某些字符的行。例如,像这样的文本文件,我想要删除包含中文字符的行:
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
编辑:我想在将其转换为数组之前执行此操作。
答案 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”
它捕获其他(非中文)字符以及最后的换行符。