Я ужасно с регулярным выражением, вы можете помочь? - PullRequest
1 голос
/ 06 декабря 2010

Последние 4 часа я пытался создать регулярное выражение, чтобы получить приведенную ниже информацию и добавить все это в массив, на котором я могу запустить forloop. Приблизительно через 2 часа, если это не сработает, 304 человека не получат текстовое сообщение, показывающее, что в нашей школьной системе теперь отменено.

http://www.wane.com/generic/weather/closings/School_Delays_and_Closings

<tr class="B">
<td width="35%">Blackhawk Christian School</td>

<td width="25%">Allen</td>

<td width="80%">2 Hour Delay&nbsp;</td>
</tr>

<tr class="S">
<td width="35%">Southwest Allen County Schools</td>

<td width="25%">Allen</td>

<td width="80%">2 Hour Delay&nbsp;</td>
</tr>

Мне нужно foreach td width="35%" добавить его в массив с информацией о школьной системе и информацией td wdith="80%". Поскольку мне это не нужно только для одной школьной системы, мне нужно проверить их все в списке и показать их пользователю.

Я делаю:

$wanetv = get_url_contents("http://www.wane.com/generic/weather/closings/School_Delays_and_Closings");

Чтобы захватить веб-страницу.


EDIT:

Пытался конвертировать некоторые C #, опубликованные ниже, в PHP ... не могу понять это. Вот моя попытка:

   $a = "<tr class='B'> <td width='35%'>Blackhawk Christian School</td> <td width='25%'>Allen</td> <td width='80%'>2 Hour Delay&nbsp;</td> </tr> <tr class='S'> <td width='35%'>Southwest Allen County Schools</td><td width='25%'>Allen</td><td width='80%'>2 Hour Delay&nbsp;</td> </tr> ";
    $SchoolNameKeyword = "<td width='35%'>";
    $DelayKeyword = "<td width='80%'>";

    while (strlen(strstr($a, $SchoolNameKeyword))>0)
    {

        $a = substr($a,strrpos($a, $SchoolNameKeyword)+strlen($SchoolNameKeyword));
        $schoolName = substr($a, 0,strrpos( $a, "<"));
        $a = substr($a,strrpos($a, $DelayKeyword) + strlen($DelayKeyword));
        $delay = substr( $a, 0,strrpos( $a, "<"));

        $arr[$schoolName] = $delay;
    }
        print_r($arr);

Распечатывает:

Array
(
    [Southwest Allen County SchoolsAllen2 Hour Delay  ] => 2 Hour Delay  
)

Ответы [ 5 ]

8 голосов
/ 06 декабря 2010

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

7 голосов
/ 06 декабря 2010

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

- Эндрю Барбер

Такой пример, используя PHP DOM может выглядеть примерно так:Тем не менее, я бы возражал против комментариев Эндрю о том, что разбор HTML «несколько более вероятно, будет продолжать работать», поскольку изменения в исходном HTML могут повлиять на него так же, как и на любое регулярное выражение.

$doc = new DOMDocument;

// Temporarily use "internal" XML error handling to keep HTML warnings quiet
libxml_use_internal_errors(true);
$doc->loadHTMLFile('http://www.wane.com/generic/weather/closings/School_Delays_and_Closings');
libxml_use_internal_errors(false);

// Find each <tr> for our schools
$xpath = new DOMXPath($doc);
$rows  = $xpath->query('///h2[.="Schools: ALL"]/following-sibling::table/tbody/tr[count(td) = 3]');

// Build array of name, county and delay information for each school
$schools = array();
foreach ($rows as $row) {
    $tds    = $row->getElementsByTagName('td');
    $school = $tds->item(0)->textContent;
    $info   = $tds->item(2)->textContent;
    $schools[$school] = $info;
}

echo "Found {$rows->length} schools:" . PHP_EOL;
print_r($schools);

Приведенное выше использованиеклассы / методы, которые вы, вероятно, не знакомы с.Задавайте вопросы.

1 голос
/ 06 декабря 2010
$a = "<tr class='B'> <td width='35%'>Blackhawk Christian School</td> <td width='25%'>Allen</td> <td width='80%'>2 Hour Delay&nbsp;</td> </tr> <tr class='S'> <td width='35%'>Southwest Allen County Schools</td><td width='25%'>Allen</td><td width='80%'>2 Hour Delay&nbsp;</td> </tr> "; 

$SchoolNameKeyword = "<td width='35%'>"; 
$DelayKeyword = "<td width='80%'>"; 
$schoolNames = array();
$delays = array();

$i = 0;
while (strlen(strstr($a, $SchoolNameKeyword))>0) 
{ 

    $a = substr($a,strrpos($a, $SchoolNameKeyword)+strlen($SchoolNameKeyword)); 
    $schoolName = substr($a, 0,strrpos( $a, "<")); 
    $a = substr($a,strrpos($a, $DelayKeyword) + strlen($DelayKeyword)); 
    $delay = substr( $a, 0,strrpos( $a, "<")); 

    $delays[$i] = $delay; 
$schoolNames[$i] = $schoolName;
} 
for ($i = 0; $i < $delays; $i++) {
    echo "School: " . $schoolNames[$i] . "\n";
    echo "Delay: " . $delays[$i] . "\n";
}
0 голосов
/ 06 декабря 2010

Использование phpQuery / QueryPath - самый простой вариант.Это выполнимо с регулярными выражениями, но трудно получить право для новичков.

Хорошей альтернативой является использование HTML <table> для преобразования класса массива.Поскольку ваши данные уже находятся в полезной структуре, обход узлов DOM кажется странным.Есть несколько быстрых примеров Google :

0 голосов
/ 06 декабря 2010

Вы уверены, что регулярное выражение - лучший способ решить эту проблему?Как насчет использования какого-либо HTML DOM API для обхода таблицы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...