2011-09-24 4 views
-1

웹 페이지에서 HTML 태그를 제거하여 반환 된 일반 텍스트에서 데이터를 추출해야합니다. 태그는 표 형식의 데이터로 구성되었지만 표가 표 안에 중첩되고 표가 중첩되어 있으므로 태그가 제거되었습니다 (정말 못생긴 HTML 코드). (HTML 깔끔한로) 코드를 청소하고 태그를 제거 후, 사이트는이 같은 정보를 반환regexps 또는 다른보다 효율적인 방법을 사용하여 일반 텍스트에서 정보 추출

Visitor ID :   123456789   HostName: 127.0.01     IP :  127.0.0.1  First Visit -> Entry Page :   First Visit Entry Page Title Example First Visit -> Referrer: http://somepage.com First Visit : 302 Day(s)    Last Visit :   09/23/2011   ISP: Initech   Country:  Some country Country:  Some  country Browser: Chrome Screen Res: Unknow 4 Billion colors (32 bit)   Javascript: Enabled  Page Views: 1  File Downloaded: 0  Daily Visits: 1 Visit Length: 0 minutes 0 seconds Entry Page: Entry page title Exit Page: Exit page title Referring URL: No 

(당신은 매우 긴 임의 혼란을 볼 수 있듯이) 내가 원하는

Visitor ID: 123456789 
HostName: 127.0.01 
IP: 127.0.01 
First Visit: 302 Day(s) 
First Visit -> Entry Page: First Visit Entry Page Title Example 
First Visit -> Referrer: http://somepage.com 
Last Visit: 09/23/2011 
ISP: Initech 
Country: Some country 
Country: Some country 
Browser: Chrome 
Screen Res: Unknow 4 Billion colors (32 bit) 
Javascript: Enabled 
Page Views: 1 
File Downloaded: 0 
Daily Visits: 1 
Visit Length: 1 minute(s) 26 second 
Entry Page: Entry page title 
Exit Page: Exit page title 
Referring URL: No 

추가 공백을 제거하고 데이터를 정렬하려고 현재 regexps를 사용하고 있습니다. 지금까지 거의 다음과 같이 작동합니다.

$patterns  = array("/HostName\s*:/", 
         "/IP\s*:/", 
         "/First\s+Visit\s+->\s+Entry\s+Page\s*:/", 
         "/First\s+Visit\s+->\s+Referrer\s*:/", 
         "/First\s+Visit\s*:/", 
         "/\bLast\s+Visit\s*:/", 
         "/\bISP\s*:/", 
         "/\bCountry\s*:/", 
         "/\bBrowser\s*:/", 
         "/\bScreen\s*Res\s*:/", 
         "/\bJavascript\s*:/", 
         "/\bPage\s+Views\s*:/", 
         "/\bFile\s+Downloaded\s*:/", 
         "/\bDaily\s+Visits\s*:/", 
         "/\bVisit\s+Length\s*:/", 
         "/\bEntry\s+Page\s*:/", 
         "/\bExit\s+Page\s*:/", 
         "/\bReferring\s+URL\s*:/", 
         "/\bFrom\s+Campaign\s*:/" ); 

$replacements = array("\nHostName:", 
         "\nIP:", 
         "\nFirst Visit -> Entry Page:", 
         "\nFirst Visit -> Referrer:", 
         "\nFirst Visit:", 
         "\nLast Visit:", 
         "\nISP:", 
         "\nCountry:", 
         "\nBrowser:", 
         "\nScreen Res:", 
         "\nJavascript:", 
         "\nPage Views:", 
         "\nFile Downloaded:", 
         "\nDaily Visits:", 
         "\nVisit Length:", 
         "\nEntry Page:", 
         "\nExit Page:", 
         "\nReferring URL:", 
         "\nFrom Campaign:" ); 
ksort($patterns); 
ksort($replacements); 

$fixed_text  = preg_replace ($patterns, $replacements, $ugly_mess); 

그러나 실제로는 예상대로 작동하지 않습니다. 일부 필드가 유사하고, 정규 표현식이 같은 결과 작동하지 않습니다 :

나는에 대한 제안이나 수정을 요구하고있어 그 이유는 내가 이것에 대해 잘못된 방향으로 갈 수
Visitor ID: 123456789 
HostName: 127.0.0.1 
IP: 127.0.0.1 
Last Visit: 302 Day(s) 
First Visit: 10 June 2010 
First Visit -> 
Entry Page: First Visit Entry Page Title Example 
First Visit -> Referrer: http://somepage 
.com 
ISP: Initech 
Country: Some Country 
Country: Some Country 
Browser: Chrome 
Screen Res: Unknow 4 Billion colors (32 bit) 
Javascript: Enabled 
Page Views: 1 
File Downloaded: 0 
Daily Visits: 1 
Visit Length: 1 minute(s) 26 second 
Entry Page: Entry page title 
Exit Page: Exit page title 
Referring URL: No 

현재 코드. 어떤 아이디어라도주세요?

답변

0

대체 패턴을 사용하는 대신 일치 항목을 사용하면 어떻게됩니까? 자바 스크립트를 사용하고 있지만 쉽게 PHP로 다시 변경할 수 있습니다.

var pattern = "^(?:"; 
    pattern += "(?:Visitor\\s*ID\\s*:\\s*(\\d+)\\s*)"; 
    pattern += "|(?:HostName\s*:\\s*([^ ]+)\\s*)"; 
    pattern += "|(?:IP\\s*:\\s*([^ ]+)\\s*)"; 
    pattern += "|(?:First\\s*Visit\\s*->\\s*Entry Page\\s*:\\s*(.+?)\\s*(?=First\\s*Visit\\s*->))"; 
    pattern += "|(?:First\\s*Visit\\s*->\\s*Referrer\\s*:\\s*(.+?)\\s*(?=First\\s*Visit\\s*:))"; 
    pattern += "|(?:First\\s*Visit\\s*:\\s*(\\d+)\\s*Day\\(s\\)\\s*)"; 
    pattern += "|(?:Last\\s*Visit\\s*:\\s*(\\d+/\\d+/\\d+)\\s*)"; 
    pattern += "|(?:ISP\\s*:\\s*(.+?)\\s*(?=Country\\s*:))"; 
    pattern += "|(?:Country\\s*:\\s*(.+?)\\s*(?=(?:Country|Browser)\\s*:))"; 
    pattern += "|(?:Browser\\s*:\\s*(.+?)\\s*(?=Screen\\s*Res\\s*:))"; 
    pattern += "|(?:Screen\\s*Res\\s*:\\s*(.+?)\\s*(?=Javascript\\s*:))"; 
    pattern += "|(?:Javascript\\s*:\\s*(.+?)\\s*(?=Page\\s*Views\\s*:))"; 
    pattern += "|(?:Page\\s*Views\\s*:\\s*(\\d+)\\s*)"; 
    pattern += "|(?:File\\s*Downloaded\\s*:\\s*(\\d+)\\s*)"; 
    pattern += "|(?:Daily\\s*Visits\\s*:\\s*(\\d+)\\s*)"; 
    pattern += "|(?:Visit\\s*Length\\s*:\\s*((?:\\d+ (?:hours|minutes|seconds)\\s*)+))"; 
    pattern += ")+"; 
    var regex = new RegExp(pattern); 

    var content = readData().replace(/ /g, ""); 
    var match = content.match(regex); 
    echo("Visitor Id: " + match[1]); 
    echo("Hostname: " + match[2]); 
    echo("IP: " + match[3]); 
    // continue on... 
관련 문제