Как обнаружить арабские символы с помощью Perl Regex - PullRequest
2 голосов
/ 09 сентября 2011

Я анализирую некоторые html-страницы, и мне нужно обнаружить любой арабский символ внутри .. Пробовал различные регулярные выражения, но не повезло ..

Кто-нибудь знает, как это сделать?

Спасибо


Вот страница, которую я обрабатываю: http://pastie.org/2509936

И мой код:

#!/usr/bin/perl 
use LWP::UserAgent; 
@MyAgent::ISA = qw(LWP::UserAgent); 

# set inheritance 
$ua = LWP::UserAgent->new; 
$q = 'pastie.org/2509936';; 
$request = HTTP::Request->new('GET', $q); 
$response = $ua->request($request); 
if ($response->is_success) { 
    if ($response->content=~/[\p{Script=Arabic}]/g) { 
        print "found arabic"; 
    } else { 
        print "not found"; 
    } 
}

Ответы [ 3 ]

5 голосов
/ 09 сентября 2011

Если вы используете Perl, вы сможете использовать оператор сопоставления сценариев Unicode./\p{Arabic}/

Если это не сработает, вам придется поискать диапазон символов Юникода для арабского языка и проверить их примерно так: /[\x{0600}\x{0601}...\x{06FF}]/.

3 голосов
/ 09 сентября 2011

РЕДАКТИРОВАТЬ (поскольку я, очевидно, забрел в область знаний о Христе).Пропустите, используя $response->content, который всегда возвращает необработанную байтовую строку, и используйте $response->decoded_content, который применяет любые подсказки декодирования, которые он получает из заголовков ответа.


Загружаемая страница имеет формат UTF-8.закодирован, но вы не читаете его как UTF-8 (честно говоря, на странице нет никаких подсказок о том, что такое кодировка [обновление: сервер возвращает заголовок Content-Type: text/html; charset=utf-8, хотя]).

Вы можете увидеть это, если изучите $response->content:

use List::Util 'max';
my $max_ord = max map{ord}split //, $response->content;
print "max ord of response content is $max_ord\n";

Если вы получите значение меньше 256, то вы читаете этот контент как необработанные байты, и ваши строкиникогда не будет соответствовать /\p{Arabic}/.Вы должны расшифровать ввод как UTF-8, прежде чем применять регулярное выражение:

use Encode;
my $content = decode('utf-8', $response->content);
# now check  $content =~ /\p{Arabic}/

Иногда (и теперь я далеко за пределами моей области знаний) загружаемая страница содержит подсказки о том, как она декодируетсяи $response->content уже может быть правильно декодирован.В этом случае вызов decode выше не нужен и может быть вредным.См. другие сообщения SO по обнаружению кодировки произвольной строки.

0 голосов
/ 21 февраля 2013

Просто для записи, по крайней мере в регулярных выражениях .NET, вам нужно использовать \p{IsArabic}.

...