2010-11-09 3 views
1

У меня эта проблема ... Интересно, есть ли у кого-нибудь идеи, как ее решить?PHP Explode by Uppercase letter?

Мне нужно разделить имя урока, имя учителя и класс.

Progr.al.Janek ManderÕ 405 Arv.võr.Tom KülaotsÕ 205

Progr.al. имя урока, Янек Мандер - имя учителя, а Õ 405 - класс. Arv.võr. Имя урока, Том Кюлаотс - имя учителя, а Õ 205 - класс.

Я должен разделить их, так что я могу идентифицировать их ... вероятно, в массив

info[0] = "Progr.al." 
info[1] = "Janek Mander" 
info[2] = "Õ 405" 

Теперь у меня есть эта идея ... если я могу обнаружить заглавную букву и заменить эту строку с и # {uppercaseletter }, тогда я могу взорвать его ... Õ 405, я могу взорваться на Õ, поскольку у каждого класса есть Õ перед ними.

Well Progrl.al.Janek ManderÕ 405 ... есть только три заглавных буквы ... и имя учителя всегда имеет вторую заглавную букву ... есть ли какой-либо способ, который я мог бы использовать это для моего пособия или делать мне нужно переписать сценарий dom?


Весь код до сих пор ...

<!doctype html> 
<html> 
<head> 
    <title>Ilus tunniplaan</title> 
    <style> 
     .tund 
     { 
      width: 140px; 
      width: 405px; 
      border: 1px solid black; 
     } 
     . 
    </style> 
</head> 
<body> 
<?php 
ini_set('error_reporting', E_ALL | E_STRICT); 
ini_set('display_errors', 'Off'); 
ini_set('log_errors', 'Off'); 

function grab_page($site) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 40); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); 
    curl_setopt($ch, CURLOPT_URL, $site); 
    ob_start(); 
    return curl_exec ($ch); 
    ob_end_clean(); 
    curl_close ($ch); 
} 

$html = grab_page("http://web.ametikool.ee/tunniplaan/11.%20n%e4dal%2008.11%20-%2013.11/"); 

$dom = new domDocument; 
    /*** load the html into the object ***/ 
    $dom->loadHTML($html); 

    /*** the table by its tag name ***/ 
    $tables = $dom->getElementsByTagName('table'); 

    /*** get all rows from the table ***/ 
    $rows = $tables->item(0)->getElementsByTagName('tr'); 

    /*** loop over the table rows ***/ 
    foreach ($rows as $row) 
    { 
     $id = $id + 1; 
     if($id > 16) 
     { 
      /*** get each column by tag name ***/ 
      $cols = $row->getElementsByTagName('td'); 
      /*** echo the values ***/ 
      for ($counter = 0; $counter <= 9; $counter += 1) 
      { 
       $phrase = $cols->item($counter)->nodeValue; 
       echo $phrase . "<br/>\n"; 
      } 
     } 
    } 
?> 
</body> 
</html> 
+0

Лично я предложил бы положить данные вместе в более организованной форме в первую очередь, опираясь на регулярное выражение и [ 'preg_split()'] (http://www.php.net/manual/en/function.preg-split.php) (вроде 'explode()' с регулярными выражениями) в лучшем случае является хрупким. –

+0

Ну, прежде чем dev-null-dweller дал мне решение, я использовал это: $ TestStr = "Tom Kulaots"; $ s = preg_replace ('/ ([^ \ s]) ([A-Z]) /', '\ 1 # \ 2', $ TestStr); $ info = explode ("#", $ s); $ TestStr = $ info [1]; $ info = explode ("Õ", $ TestStr); $ name = $ info [0]; –

ответ

1

Tricky, но я хотел бы сделать это следующим образом: (внутри for петли)

for ($counter = 0; $counter <= 9; $counter += 1) 
{ 
    $phrase = $cols->item($counter); 

    $breaklines = $phrase->getElementsByTagName('br'); 
    if($breaklines->length == 2) 
    { 
     $br = array(); 
     for($i=0;$i<2;$i++) 
     { 
      $br[$i] = $breaklines->item($i); 
     } 
     //Don't try to put this two for-loops into one. 
     for($i=0;$i<2;$i++) 
     { 
      $phrase->replaceChild($dom->createTextNode('|'), $br[$i]); 
     } 

     print_r(explode('|',$phrase->nodeValue)) . PHP_EOL; 
    } 
} 
+0

Работает как шарм. Благодарю. –

0

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